思路
解决是个圈的问题,直接复制一遍数组,然后跑区间DP就好了。 区间DP是先枚举长度,再枚举起点,然后在起点和终点之间枚举中间点,表示合并的两个区间。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[205],mx[205][205],mi[205][205],sum[205];
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
}
sum[0]=0;
for(int i=1;i<=2*n;i++){
sum[i]=sum[i-1]+a[i];
}
memset(mx,0,sizeof(mx));
memset(mi,127/3,sizeof(mi));
for(int i=1;i<=2*n;i++) mi[i][i]=0;
for(int len=2;len<=n;len++){
for(int l=1;l<=2*n-len+1;l++){
int r=l+len-1;
for(int k=l;k<r;k++){
mx[l][r]=max(mx[l][r],mx[l][k]+mx[k+1][r]+sum[r]-sum[l-1]);
mi[l][r]=min(mi[l][r],mi[l][k]+mi[k+1][r]+sum[r]-sum[l-1]);
}
}
}
int maxx=-10000000,minn=10000000;
for(int i=1;i<=n;i++){
maxx=max(maxx,mx[i][i+n-1]);
minn=min(minn,mi[i][i+n-1]);
}
cout<<minn<<endl;
cout<<maxx<<endl;
return 0;
}