//啦啦啦
//合并相邻堆的石子
//状态表示f[i][j]:所有将第i到第j堆石子合并成一堆石子的方式
//状态计算:f[i][j]=min(f[i][k]+f[k+1][j]+s[j]-s[i-1])k=1,//2...k-1
#include<iostream>
#include<algorithm>
using namespace std;
const int N=310;
int n;
int s[N];
int f[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=n;i++)s[i]+=s[i-1];
//len代表石子的堆数,保证先得到合并堆数少的数据
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int l=i,r=i+len-1;
f[l][r]=1e8;//定义为大数,用来更新最小
for(int k=l;k<r;k++)
f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
}
cout<<f[1][n];
return 0;
}