http://acm.hdu.edu.cn/showproblem.php?pid=2571
枚举每一个点,找出按照题目要求的这个点的上一点的最大值,合并到当前点,注意只取前面的一种情况
1 #include<cstdio> 2 using namespace std; 3 int val[21][1001]; 4 int max(int x,int y) 5 { 6 if (x<y) return y; 7 else return x; 8 } 9 int main() 10 { 11 int t,i,j,k,n,m; 12 while (~scanf("%d",&t)){ 13 while (t--) 14 { 15 scanf("%d %d",&n,&m); 16 for (i=1;i<=n;i++) 17 { 18 for (j=1;j<=m;j++) 19 { 20 scanf("%d",&val[i][j]); 21 val[0][j]=-101; 22 } 23 val[i][0]=-101; 24 } 25 val[1][0]=val[0][1]=0; 26 for (i=1;i<=n;i++) 27 { 28 for (j=1;j<=m;j++) 29 { 30 int ans=-101; 31 ans=max(ans,val[i-1][j]); 32 ans=max(ans,val[i][j-1]); 33 for (k=1;k<j;k++) 34 { 35 if (j%k==0) 36 ans=max(ans,val[i][k]); 37 } 38 val[i][j]+=ans; 39 } 40 } 41 /*for (i=1;i<=n;i++) 42 { 43 for (j=1;j<=m;j++) 44 printf("%d ",val[i][j]); 45 printf("\n"); 46 }*/ 47 printf("%d\n",val[n][m]); 48 } 49 } 50 return 0; 51 }