HDU1078:FatMouse and Cheese(记忆化 dp+搜索) (P)

来源:互联网 发布:新浪微博刷粉软件 编辑:程序博客网 时间:2024/05/15 08:01

题目链接:hdu1078

题目大意:FatMouse在一个N*N方格上找吃的,每一个点(x,y)上有一些吃的,FatMouse从(0,0)的位置出发去找吃的,并且每次最多走k步,在他走过的地方就可以吃掉吃的,保证吃的数量在0-100之间,而规定是他只能水平或者垂直走,而且每走一步,下一步的吃的数量是需要大于此刻所占的位置,问FatMouse最后最多可以吃多少吃的。那么因为他是可以在水平和垂直上面随便走的,所以这个DP就没有一定的方向性和子局面可以确定,所以只用DP是不好做出来的,这类采用DP+搜索的方法。

#include<stdio.h>#include<stdlib.h>#include<algorithm>#include <iostream>#include<cstring>using namespace std;#define maxn 500int maps[maxn][maxn];int dp[maxn][maxn];int n,k;int go[4][2]={1,0,-1,0,0,1,0,-1};bool check(int x,int y){if(x>=0&&x<n&&y>=0&&y<n)return true;return false;}int dfs(int x,int y){if(!dp[x][y]){int ans=0;for(int i=1;i<=k;i++){for(int j=0;j<4;j++){int xx=x+go[j][0]*i;int yy=y+go[j][1]*i;if(!check(xx,yy))continue;if(maps[xx][yy]>maps[x][y])ans=max(ans,dfs(xx,yy));}}dp[x][y]=ans+maps[x][y];}return dp[x][y];}int main(){while(~scanf("%d%d",&n,&k)){if(n==-1&&k==-1)break;for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&maps[i][j]);memset(dp,0,sizeof dp);printf("%d\n",dfs(0,0));}return 0;}


原创粉丝点击