题意:FatMouse在一个N*N方格上找吃的,每个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的,每次最多走k步,他走过的位置可以吃掉吃的,保证吃的数量在0-100,规定他只能水平或者垂直走,每走一步,下一步吃的数量需要大于此刻所在位置,问FatMouse最多可以吃多少东西。
需要对步数进行扩展。
#include<iostream> using namespace std; #define N 101 #define max(a,b) ((a)>(b)?(a):(b)) int dp[N][N],map[N][N]; int k,n; int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; bool ok(int x,int y) //判断边界 { return x>=0 && y>=0 && x<n && y<n; } int dfs(int x,int y) //记忆化搜索 { int i,j,max=0,xt,yt,tmp; if(dp[x][y]>0) return dp[x][y]; for(i=0;i<4;i++) for(j=1;j<=k;j++) { xt=dir[i][0]*j+x; yt=dir[i][1]*j+y; if(ok(xt,yt)&&map[x][y]<map[xt][yt]) { tmp=dfs(xt,yt); if(tmp>max) //找到最大的 max=tmp; } } dp[x][y]=max+map[x][y]; return dp[x][y]; } int main() { int i,j; while(scanf("%d%d",&n,&k)==2 && k!=-1 && n!=-1) { for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); memset(dp,0,sizeof(dp)); cout<<dfs(0,0)<<endl; } return 0; }
HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
原文地址:http://blog.csdn.net/a809146548/article/details/46358443