#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxx=2002; int dp[maxx][maxx],mark[maxx][maxx],sum[maxx][maxx]; int data[maxx]; int min(int a,int b){ return a<b?a:b; } int main() { int n; while (scanf("%d",&n)!=EOF) { for (int i=1;i<=n;i++) { scanf("%d",&data[i]); data[i+n]=data[i]; } memset(sum,0,sizeof(sum)); for (int i=1;i<2*n;i++) { dp[i][i]=0; mark[i][i]=i; for (int j=i;j<=n+i;j++) { sum[i][j]=sum[i][j-1]+data[j]; } } for (int st=2;st<=n;st++) { for (int i=1;i+st<=2*n+1;i++) { int j=i+st-1; dp[i][j]=99999999; for (int k=mark[i][j-1];k<=mark[i+1][j];k++) { int temp=dp[i][k]+dp[k+1][j]+sum[i][j]; if (dp[i][j]>temp) { dp[i][j]=temp; mark[i][j]=k; } } } } int ans=9999999; for (int i=1;i<=n;i++) { ans=min(ans,dp[i][i+n-1]); } printf("%d\n",ans); } return 0; }