区间dp模板题.
注意石子是环形放置的.
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define maxn 0x3f3f3f3f
using namespace std;
int dp1[205][205];
int dp2[205][205];
int a[205];
int s[205];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=n+n;++i){
s[i]=s[i-1]+a[i];
}
for(int len=2;len<=n;++len){
for(int i=1;i<=n+n+1-len;++i){
int j=i+len;
dp1[i][j]=maxn;
for(int k=i+1;k<j;++k){
dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k][j]+s[j-1]-s[i-1]);
dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k][j]+s[j-1]-s[i-1]);
}
}
}
int ans1=maxn,ans2=0;
for(int i=1;i<=n;++i){
ans1=min(dp1[i][i+n],ans1);
ans2=max(dp2[i][i+n],ans2);
}
cout<<ans1<<endl;
cout<<ans2<<endl;
return 0;
}