http://acm.hdu.edu.cn/showproblem.php?pid=1231 这道题目还是简单的DP,一开始不懂做,看了看解题报告,觉得有个思想特别好,因为当sum>0时sum加上当前值a[i]肯定比a[i]要大,而Sum<0时肯定要小,所以sum<0时,sum=a[i]。然后再利用max找出最大的和,并且用x,y标记始末位置,这里很巧妙的就可以不用处理0和全是负数的情况了,只有全是负数,max猜可能是负数,当max=0的时候,情况也包括在里面了,wa一次因为数组开小了,把10000看成1000了。。。。 代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> int a[102][102]; void dp(int n) { if(n==0) return ; for(int j=n;j>=0;--j) { if(a[n][j]+a[n-1][j-1]<a[n-1][j-1]+a[n][j-1]) a[n-1][j-1]=a[n-1][j-1]+a[n][j-1]; else a[n-1][j-1]=a[n][j]+a[n-1][j-1]; } dp(n-1); } int main() { int t,m; scanf("%d",&t); while(t--) { scanf("%d",&m); for(int i=0;i<m;++i) for(int j=0;j<=i;++j) scanf("%d",&a[i][j]); dp(m); printf("%d\n",a[0][0]);
} system("pause"); return 0; } |