区间类动态规划,理解规划方程后注意方程的求解。做到范围不错,依赖关系不错。 /* task:石子合并 author:mike wang email:creativewang@163.com date:2011-05-14 23:28 submit site:rqnoj.com OR sznoi.cn/oj ps:此题进行比较顺利,因为刚昨晚能量项链 */ #include<stdio.h> #define SIZE 120 #define INFINITY (1<<20) long max(long m,long n) { return m>n?m:n; } long min(long m,long n) { return m>n?n:m; } int main(void) { long n,s[SIZE*2],opt[SIZE*2][SIZE*2], ans1,ans2,sum[SIZE*2]; scanf("%ld",&n); long i,j,k; for(i=1;i<=n;i++) scanf("%ld",&j),s[i]=s[i+n]=j; for(i=1,sum[0]=0;i<=2*n;i++) sum[i]=sum[i-1]+s[i]; for(i=0;i<SIZE*2;i++) for(j=0;j<SIZE*2;j++) opt[i][j]=0; for(i=2;i<=n;i++) for(j=1;j+i-1<=2*n;j++) for(k=j;k<i+j-1;k++) opt[j][j+i-1]=max(opt[j][j+i-1],opt[j][k]+opt[k+1][i+j-1]+sum[i+j-1]-sum[j-1]); for(i=1,ans2=0;i<=n;i++) ans2=max(ans2,opt[i][i+n-1]); for(i=0;i<SIZE*2;i++) for(j=0;j<SIZE*2;j++) opt[i][j]=INFINITY; for(i=0;i<SIZE*2;i++) opt[i][i]=0; for(i=2;i<=n;i++) for(j=1;j+i-1<=2*n;j++) for(k=j;k<i+j-1;k++) opt[j][j+i-1]=min(opt[j][j+i-1],opt[j][k]+opt[k+1][i+j-1]+sum[i+j-1]-sum[j-1]); for(i=1,ans1=INFINITY;i<=n;i++) ans1=min(ans1,opt[i][i+n-1]); printf("%ld/n%ld/n",ans1,ans2); return 0; }