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 }
这种题还是不会,滑雪那道题还是得再刷一遍= =