FatMouse and Cheese HDU - 1078

原题链接

考察:记忆化搜索

错误思路:

       将f[i][j]定义为达到此点的最大分数,结果是TLE.

正确思路:

       和滑雪那道题一样,要将f[i][j]定义为从mp[i][j]出发的最大分数.

       应该考虑记忆化搜索的优化原理是搜过一次就不要再搜

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 110;
 7 int mp[N][N],m,n,ans,f[N][N];
 8 int xx[4] = {-1,1,0,0};
 9 int yy[4] = {0,0,-1,1};
10 int dfs(int x,int y)
11 {
12     if(f[x][y]) return f[x][y];
13     int sum = 0;
14     for(int i=0;i<4;i++)
15       for(int j=1;j<=m;j++)
16       {
17           int dx = x+xx[i]*j,dy = y+yy[i]*j;
18           if(dx>0&&dx<=n&&dy>0&&dy<=n&&mp[dx][dy]>mp[x][y])
19               sum = max(dfs(dx,dy),sum);
20       }
21     return f[x][y] = mp[x][y]+sum; 
22 }
23 int main() 
24 {
25     while(scanf("%d%d",&n,&m)!=EOF&&n!=-1)
26     {
27         memset(f,0,sizeof f);
28         for(int i=1;i<=n;i++)
29           for(int j=1;j<=n;j++)  scanf("%d",&mp[i][j]);
30         dfs(1,1);
31         printf("%d\n",f[1][1]);
32     }
33     return 0;
34 }

 

这种题还是不会,滑雪那道题还是得再刷一遍= =

posted @ 2021-02-18 20:21  acmloser  阅读(42)  评论(0编辑  收藏  举报