求教

P1880 [NOI1995] 石子合并

```cpp #include<iostream> #include<algorithm> using namespace std; int n,a[201],sum[201],dpmax[201][201],dpmin[201][201]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i+n]=a[i]; } for(int i=1;i<=n*2;i++) { sum[i]=sum[i-1]+a[i]; } for(int len=2;len<=n;len++) { for(int i=1;i+len-1<=2*n;i++) { int j=i+len-1; int maxn=0,minn=1e9; for(int k=i;k+1<=j;k++) { maxn=max(maxn,dpmax[i][k]+dpmax[k+1][j]+sum[j]-sum[i-1]); minn=min(minn,dpmin[i][k]+dpmin[k+1][j]+sum[j]-sum[i-1]); } dpmax[i][j]=maxn; dpmin[i][j]=minn; } } int maxn=0,minn=1e9; for(int i=1;i<=n;i++) { int j=i+n-1; minn=min(minn,dpmin[i][j]); maxn=max(maxn,dpmax[i][j]); } cout<<minn<<endl<<maxn; } //dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); ```
by vvsv @ 2017-11-07 14:35:19


|