package main
import (
"fmt"
)
func main() {
var n int32
var cost [50]int32
var dp, roots [50][50]int32
fmt.Scan(&n)
for i := int32(1); i <= n; i++ {
fmt.Scan(&cost[i])
dp[i][i] = cost[i]
roots[i][i] = i
}
for l := int32(2); l <= n; l++ {
for i := int32(1); i <= n && i+l-1 <= n; i++ {
j := i + l - 1
for k := i; k <= j; k++ {
left, right := int32(1), int32(1)
if k != i {
left = dp[i][k-1]
}
if j != k {
right = dp[k+1][j]
}
score := cost[k] + left*right
if dp[i][j] < score {
dp[i][j] = score
roots[i][j] = k
}
}
}
}
// for i:=n; i>0; i-- {
// for j:= i+1; j <=n; j++ {
// for k:=i; k <=j; k++ {
// score := cost[k]
// if k -i > 0 && j-k > 0{
// score += dp[i][k-1]*dp[k+1][j]
// } else if k -i > 0{
// score += dp[i][k-1]
// } else if j-k > 0{
// score += dp[k+1][j]
// }
// if dp[i][j] < score {
// dp[i][j] = score
// roots[i][j] = k
// }
// }
// }
// }
list := make([]int32, 0, n)
var dfs func(left, right int32)
dfs = func(left, right int32) {
list = append(list, roots[left][right])
if left >= right {
return
}
if left < roots[left][right] {
dfs(left, roots[left][right]-1)
}
if roots[left][right] < right {
dfs(roots[left][right]+1, right)
}
}
dfs(1, n)
fmt.Println(dp[1][n])
for i := int32(0); i < n; i++ {
if i < n-1 {
fmt.Printf("%d ", list[i])
} else {
fmt.Println(list[i])
}
}
}