记忆化搜索hdu1078 dfs

 

http://acm.hdu.edu.cn/showproblem.php?pid=1078

题意:给出n*n的格子,每个各自里面有些食物,问一只老鼠每次走最多k步所能吃到的最多的食物

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 using namespace std;
 5 int dp[110][110],s[110][110];
 6 int n,k,t[4][2]= {1,0,-1,0,0,1,0,-1};
 7 int dfs(int x,int y)
 8 {
 9     int maxx=0,xx,yy,ans;
10     if(!dp[x][y])
11     {
12         for(int i=1; i<=k; i++)
13         {
14             for(int j=0; j<4; j++)
15             {
16                 xx=x+t[j][0]*i;
17                 yy=y+t[j][1]*i;
18                 if(xx>=0&&xx<n&&yy>=0&&yy<n&&s[xx][yy]>s[x][y])
19                 {
20                     ans=dfs(xx,yy);
21                     if(ans>maxx)
22                         maxx=ans;
23                 }
24             }
25         }
26         dp[x][y]=maxx+s[x][y];
27     }
28     return dp[x][y];
29 }
30 int main()
31 {
32     while(scanf("%d%d",&n,&k)>0)
33     {
34         if(n==-1&&k==-1)
35             break;
36         for(int i=0; i<n; i++)
37             for(int j=0; j<n; j++)
38                 scanf("%d",&s[i][j]);
39         memset(dp,0,sizeof(dp));
40         int sum=dfs(0,0);
41         printf("%d\n",sum);
42     }
43     return 0;
44 }

 

posted @ 2015-07-21 21:59  zach96  阅读(175)  评论(0编辑  收藏  举报