hdu 2571

地址: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 }
posted @ 2012-04-27 06:19  Seraph2012  阅读(360)  评论(0编辑  收藏  举报