记忆化搜索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 }