Divide DP
Note the ring, you need to copy the original number two copies to proceed, see:
Http://www.cnblogs.com/FuTaimeng/p/5427426.html
Initial conditions: dp[i][i]=0
Transfer equation: dp[i][j] = max/min{dp[i][u]+dp[u+1][j]+sum (i,j)}
Answer: max/min{dp[i][i+n-1]} i=1 to N+1
The code is as follows:
#include <iostream>#include<cstring>#defineSize 105using namespacestd;intN;intA[size];intDp1[size][size];//minintDp2[size][size];//Maxintsum[size]; inlineintSintLintR) {returnsum[r]-sum[l-1];}intMain () {memset (DP1,0x3f,sizeof(DP1)); memset (DP2,-1,sizeof(DP2)); CIN>>N; for(intI=1; i<=n;i++) {cin>>A[i]; A[i+n]=A[i]; } for(intI=1; i<=2*n;i++) {Sum[i]=sum[i-1]+A[i]; Dp1[i][i]=dp2[i][i]=0; } for(intI=1; i<n*2; i++) {Dp1[i][i+1]=dp2[i][i+1]=a[i]+a[i+1]; } for(intlen=3; len<=n;len++){ for(intI=1; i+len-1<=n*2; i++){ intj=i+len-1; //dp1[i][j]=min (dp1[i+1][j],dp1[i][j-1]) +s (I,J); //Dp2[i][j]=max (dp2[i+1][j],dp2[i][j-1]) +s (i,j); for(intu=i;u<j;u++) {Dp1[i][j]=min (Dp1[i][j], dp1[i][u]+dp1[u+1][j]+s (i,j)); DP2[I][J]=max (Dp2[i][j], dp2[i][u]+dp2[u+1][j]+s (i,j)); } //cout<<i<< "," <<j<< ":" <<dp1[i][j]<< "" <<dp2[i][j]<<endl; } //cout<<endl; } intans1=0x3f3f3f3f, ans2=-0x3f3f3f3f; for(intI=1; i<=n+1; i++) {ans1=min (ans1,dp1[i][i+n-1]); Ans2=max (ans2,dp2[i][i+n-1]); } cout<<ans1<<Endl; cout<<ans2<<Endl; return 0;}
code2102 Stone Merge 2