hdu_p1078(记忆化搜索)

来源:互联网 发布:淘宝河北邢台羊绒衫 编辑:程序博客网 时间:2024/05/23 02:10

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


分析:题目的要求是要从(0,0)的位置开始到最后停止(不能像四个方向移动了)所吃到的cheese的量;

            每次移动应该满足的条件:1. 现在的cheese量要比前一次的多 2. 一次可以移动多个(小于等于k)

     

            在搜索过程中记录从该点出发能够吃到的cheese量

   

代码:

        

//hdu1078 fatmouse and cheese#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int n,k;int vis[104][104],mark[104][104];int  map[104][104],dp[104][104];int  ndir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int max(int a,int b){    return a>b ? a : b;}bool judge(int x,int y){return (x>=0)&&(x<n)&&(y>=0)&&(y<n)&&(!vis[x][y]);}void dfs(int a,int b){int x,y;mark[a][b]=1;vis[a][b]=1;for(int i=1;i<=k;i++){for(int j=0;j<4;j++){x=a+ndir[j][0]*i;y=b+ndir[j][1]*i;if(judge(x,y)&&map[x][y]>map[a][b]){if(mark[x][y])dp[a][b]=max(dp[a][b],map[a][b]+dp[x][y]);else{dfs(x,y);dp[a][b]=max(dp[a][b],map[a][b]+dp[x][y]);}}   }}if(!dp[a][b]) dp[a][b]=map[a][b];vis[a][b]=0;}int main(){   while(scanf("%d%d",&n,&k)!=EOF){   if(n==-1&&k==-1) break;   for(int i=0;i<n;i++)   for(int j=0;j<n;j++)   scanf("%d",&map[i][j]);   memset(dp,0,sizeof(dp));       memset(mark,0,sizeof(mark));   memset(vis,0,sizeof(vis));           mark[0][0]=1;dfs(0,0);       printf("%d\n",dp[0][0]);   }}

   

原创粉丝点击