转载请注明出处:http://blog.csdn.net/u012860063
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571
1 3 8 9 10 10 10 10 -10 10 10 10 -11 -1 0 2 11 10 -20 -11 -11 10 11 2 10 -10 -10
52
中文就不用解释题意了!
代码如下:
#include <cstdio> int MAX(int a,int b) { if(a > b) return a; return b; } int f[22][1047]; int main() { int n,m,t,i,j,k,c; scanf("%d",&c); while(c--) { scanf("%d%d",&n,&m); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) { scanf("%d",&f[i][j]); } for(i = 0; i <= n; i++) //设为下界的值 f[i][0]=-1000; for(i = 0; i <= m; i++) //设为下界的值 f[0][i]=-1000; for(i = 1; i<= n; i++) { for(j = 1; j <= m; j++) { if(i==1 && j==1) continue; t = f[i][j-1];//同行向右走一格 for(k = 2; k <= j; k++) //计算当走倍数的时候 {//寻找能通过倍数到达此时f[i][j]的最大值 if(j%k == 0) if(t < f[i][j/k]) t = f[i][j/k]; } f[i][j] +=MAX(f[i-1][j],t);//同行能走到的最大值和下一行能走到的比较 } } printf("%d\n",f[n][m]); } return 0; }