Shirlies
宁静专注认真的程序媛~

http://acm.hdu.edu.cn/showproblem.php?pid=1078人家说是简单题,我说是神题,这个就是大大滴差距\可怜

神奇的DP+记忆化搜索

只要将各个方向递归退栈后得到的最大值用dp[x][y](这里的最优就是各个方向上的最大值加上此处的cheese)记录下来,以后如果再次搜索到这个地方时可以直接返回该处的值……

ps一句:看了别人的题解后才弄出来的……

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int dp[105][105];
 5 int inp[105][105];
 6 int n,k;
 7 int dirx[4] = {-1,0,1,0};
 8 int diry[4] = {0,-1,0,1};
 9 
10 int dfs(int x,int y)
11 {
12     if(dp[x][y] > 0)
13         return dp[x][y];
14 
15     int maxn = 0;
16     for(int i =0;i < 4;i ++)
17     {
18         for(int j = 1;j <= k;j ++)
19         {
20             int rx = x + dirx[i] * j;
21             int ry = y + diry[i] * j;
22             if(rx < 0 || rx >= n || ry < 0 || ry >= n || inp[rx][ry] <= inp[x][y])
23                 continue;
24             int ans = dfs(rx,ry);
25             if(maxn < ans)
26                 maxn = ans;
27         }
28     }
29 
30     dp[x][y] += maxn + inp[x][y];
31     return dp[x][y];
32 }
33 
34 int main()
35 {
36     while(scanf("%d%d",&n,&k) == 2)
37     {
38         if(n == -1 || k == -1)
39             break;
40 
41         for(int i = 0;i < n;i ++)
42         {
43             for(int j = 0;j < n;j ++)
44             {
45                 scanf("%d",&inp[i][j]);
46             }
47         }
48 
49         memset(dp,0,sizeof(dp));
50 
51         dfs(0,0);
52         printf("%d\n",dp[0][0]);
53     }
54 
55     return 0;
56 }
posted on 2012-08-15 16:16  Shirlies  阅读(183)  评论(0编辑  收藏  举报