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 }

 

posted on 2015-10-16 12:43  蜘蛛侦探  阅读(143)  评论(0编辑  收藏  举报