方程:dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]
环形 dp 模板题
const int N=400+5;
int n,m,t;
int i,j,k;
int a[N];
int sum[N],dp_max[N][N],dp_min[N][N];
int main()
{
IOS;
while(cin>>n){
for(i=1;i<=n;i++){
cin>>a[i];
a[n+i]=a[i];
}
sum[0]=0;
for(i=1;i<=2*n;i++){
sum[i]=sum[i-1]+a[i];
dp_max[i][i]=dp_min[i][i]=0;
}
for(int len=2;len<=n;len++){
for(i=1;i+len-1<=2*n;i++){
j=i+len-1;
dp_min[i][j]=inf,dp_max[i][j]=0;
for(k=i;k<j;k++){
dp_min[i][j]=min(dp_min[i][k]+dp_min[k+1][j],dp_min[i][j]);
dp_max[i][j]=max(dp_max[i][k]+dp_max[k+1][j],dp_max[i][j]);
}
int tmp=sum[j]-sum[i-1];
dp_max[i][j]+=tmp;
dp_min[i][j]+=tmp;
}
}
int maxx=0,minn=inf;
for(i=1;i<=n;i++){
maxx=max(maxx,dp_max[i][i+n-1]);
minn=min(minn,dp_min[i][i+n-1]);
}
cout<<minn<<endl;
cout<<maxx<<endl;
}
//PAUSE;
return 0;
}