地址:http://acm.hdu.edu.cn/showproblem.php?pid=2571
题意:中文。
mark:水dp。不过边界不太好处理,写成dfs+记忆化比较方便。
给2组容易错的数据。应该都输出0。
2
1 2
-1 1
2 1
-1
1
代码:
1 # include <stdio.h> 2 3 4 int a[25][1010], vis[25][1010] ; 5 int n, m, INF = 0x0f0f0f0f ; 6 7 8 int max(int a, int b){return a>b?a:b;} 9 10 11 int dfs(int x, int y) 12 { 13 int i, rtn = -INF ; 14 if (x == n && y == m) return a[x][y] ; 15 if (vis[x][y] != INF) return vis[x][y] ; 16 if (x < n) rtn = max(rtn, dfs(x+1, y)) ; 17 if (y < m) rtn = max(rtn, dfs(x, y+1)) ; 18 for (i = y * 2 ; i <= m ; i+=y) 19 rtn = max(rtn, dfs(x, i)) ; 20 // printf ("%d, %d, %d\n", x, y, rtn+a[x][y]) ; 21 return vis[x][y] = rtn + a[x][y] ; 22 } 23 24 25 int main () 26 { 27 int T, i, j ; 28 scanf ("%d", &T) ; 29 while (T--) 30 { 31 scanf ("%d%d", &n, &m) ; 32 for (i = 1 ; i <=n ; i++) 33 for (j = 1 ; j <= m ; j++) 34 { 35 vis[i][j] = INF ; 36 scanf ("%d", &a[i][j]) ; 37 } 38 printf ("%d\n", dfs(1,1)) ; 39 } 40 return 0 ; 41 }