#include <iostream>
using namespace std;
const int INF = 1 << 30;// 1向右移动30个字符:制造一个大数。
const int N = 205;
int dp[N][N],sum[N],a[N];
int getMinval (int a[],int n)
{
for (int i = 0;i < n;i++) dp[i][i] = 0;
for (int v = 1;v < n;v++) //v是f[i][j]中的j-i+1
for (int i = 0;i < n - v ;i++)
{
int j = i + v;
dp[i][j] = INF;
int tmp = sum[j] - (i > 0 ? sum[i - 1]:0);
for (int k = i;k < j;k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j] + tmp);
}
return dp[0][n-1];
}
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++) cin >> a[i];
sum[0]=a[0];
for (int i = 1;i < n;i++) sum[i] = sum[i-1] + a[i];
cout<< getMinval(a,n) <<endl;
system("pause");
return 0;
}
/*
s[i]=第1堆石子到第i堆石子的数量.
f[i][j]=f[i][k]+f[k+1][j];
*/
using namespace std;
const int INF = 1 << 30;// 1向右移动30个字符:制造一个大数。
const int N = 205;
int dp[N][N],sum[N],a[N];
int getMinval (int a[],int n)
{
for (int i = 0;i < n;i++) dp[i][i] = 0;
for (int v = 1;v < n;v++) //v是f[i][j]中的j-i+1
for (int i = 0;i < n - v ;i++)
{
int j = i + v;
dp[i][j] = INF;
int tmp = sum[j] - (i > 0 ? sum[i - 1]:0);
for (int k = i;k < j;k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j] + tmp);
}
return dp[0][n-1];
}
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++) cin >> a[i];
sum[0]=a[0];
for (int i = 1;i < n;i++) sum[i] = sum[i-1] + a[i];
cout<< getMinval(a,n) <<endl;
system("pause");
return 0;
}
/*
s[i]=第1堆石子到第i堆石子的数量.
f[i][j]=f[i][k]+f[k+1][j];
*/