hdu2571
http://acm.hdu.edu.cn/showproblem.php?pid=25
动归经典模型(从一个矩阵的左上角到右下角的最优数值),但是一定要注意初始化,在此处wa了好多次!!
1 #include<stdio.h>
2 #define max(a,b) ((a)>(b)?(a):(b))
3 #define INF 100000000
4 int map[21][1001],sum[21][1001];
5 int main()
6 {
7 int num;
8 scanf("%d",&num);
9 while(num--)
10 {
11 int n,m;
12 scanf("%d %d",&n,&m);
13 for(int i=0;i<=n;i++) sum[i][0]=-INF;
14 for(int j=0;j<=m;j++) sum[0][j]=-INF;
15 sum[0][1]=sum[1][0]=0; /*初始化都是为了保证以后每一步的起始点都是
16 map[1][1]而不是其他点,仔细思考*/
17 for(int i=1;i<=n;i++)
18 for(int j=1;j<=m;j++)
19 scanf("%d",&map[i][j]);
20 for(int i=1;i<=n;i++)
21 for(int j=1;j<=m;j++)
22 {
23 sum[i][j]=max(sum[i-1][j],sum[i][j-1])+map[i][j];
24 int k=2;
25 while(j/k>0)
26 {
27 if(j%k==0)
28 sum[i][j]=max(sum[i][j],map[i][j]+sum[i][j/k]);
29 k++;
30 } //寻找同一行中可以直接到该列的最大数值
31 }
32 printf("%d\n",sum[n][m]);
33 }
34 return 0;