hdu1078(记忆化搜索)
题意:给出n*n的格子,每个各自里面有些食物,问一只老鼠每次走最多k步所能吃到的最多的食物
这道题目,值得我记住它,re了n次,以前写搜索没有注意的一个小地方,导致re这么多次的
ac代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[110][110],s[110][110]; int n,k,t[4][2]={1,0,-1,0,0,1,0,-1}; int dfs(int x,int y) { int maxx=0,xx,yy,ans; if(!dp[x][y]) { for(int i=1;i<=k;i++) { for(int j=0;j<4;j++) { xx=x+t[j][0]*i; yy=y+t[j][1]*i; if(xx>=0&&xx<n&&yy>=0&&yy<n&&s[xx][yy]>s[x][y]) { ans=dfs(xx,yy); if(ans>maxx) maxx=ans; } } } dp[x][y]=maxx+s[x][y]; } return dp[x][y]; } int main() { while(scanf("%d%d",&n,&k)>0) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&s[i][j]); memset(dp,0,sizeof(dp)); int sum=dfs(0,0); printf("%d\n",sum); } return 0; }
re代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[110][110],s[110][110]; int n,k,t[4][2]={1,0,-1,0,0,1,0,-1}; int dfs(int x,int y) { int maxx=0,xx,yy,ans; if(!dp[x][y]) { for(int i=1;i<=k;i++) { for(int j=0;j<4;j++) { xx=x+t[j][0]*i; yy=y+t[j][1]*i; if(s[xx][yy]>s[x][y]&&xx>=0&&xx<n&&yy>=0&&yy<n) //这里错了,不能将s[xx][yy]先判断,否则出现re { ans=dfs(xx,yy); if(ans>maxx) maxx=ans; } } } dp[x][y]=maxx+s[x][y]; } return dp[x][y]; } int main() { while(scanf("%d%d",&n,&k)>0) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&s[i][j]); memset(dp,0,sizeof(dp)); int sum=dfs(0,0); printf("%d\n",sum); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。