NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 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初始化时应该初始为极大的负数;
View Code

 

posted on 2017-03-24 19:05  NWU_ACM  阅读(102)  评论(0编辑  收藏  举报