import java.util.*;
public class Main{
static final int N = 310;
static int n; // 实际石子堆数。
static int[] a = new int[N]; // 存储石子的累积质量。
static int[][] dp = new int[N][N]; // DP数组,dp[i][j]表示合并石子堆[i,j]的最小代价。
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
n = sca.nextInt(); // 读取石子堆数。
for (int i = 1; i <= n; i++ )
{
// 读取每堆石子的质量,并计算前缀和,方便之后计算区间和。
a[i] = sca.nextInt() + a[i - 1];
}
for (int len = 2; len <= n; len++ ) // 枚举区间长度。
{
for (int i = 1; i + len - 1 <= n; i++ ) // 枚举区间起点。
{
int j = i + len - 1; // 确定区间终点。
dp[i][j] = Integer.MAX_VALUE; // 初始化当前区间的最小代价为无穷大。
for (int k = i; k < j; k++ ) // 枚举分割点。
{
// 更新最小代价。dp[i][k]是合并[i,k]的最小代价,dp[k+1][j]是合并[k+1,j]的最小代价。
// a[j] - a[i - 1]是当前区间[i,j]的总质量。
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j] + a[j] - a[i - 1]);
}
}
}
System.out.println(dp[1][n]); // 输出合并整个区间[1,n]的最小代价。
}
}