![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 long long int a[25][1005],sum[25][1005]; 3 long long int max(long long int x,long long int y) 4 { 5 if(x>y) return x; 6 else return y; 7 } 8 //比较两个数的大小并返回大的数 9 int main() 10 { 11 int i,j,k,l,n,m,t,u; 12 scanf("%d",&t); 13 for(u=0;u<t;u++) 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("%lld",&a[i][j]); 21 sum[i][j]=-99999999; 22 } 23 } 24 sum[1][1]=a[1][1]; 25 for(i=1;i<=n;i++) 26 { 27 for(j=1;j<=m;j++) 28 { 29 l=2*j; 30 while(l<=m) 31 { 32 sum[i][l]=max(sum[i][l],sum[i][j]+a[i][l]); 33 l=l+j; 34 } 35 //更新这个格子能更新的同为i行的格子 36 if(j<m) sum[i][j+1]=max(sum[i][j+1],sum[i][j]+a[i][j+1]); 37 //更新这个格子的右边一个格子 38 if(i<n) sum[i+1][j]=max(sum[i+1][j],sum[i][j]+a[i+1][j]); 39 //更新这个格子的下面一个格子 40 } 41 } 42 printf("%lld\n",sum[n][m]); 43 } 44 } 45 //注意负值情况,sum初始化时应该初始为极大的负数;