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])
		}
	}
}