码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1078 FatMouse and Cheese 记忆化+DFS

时间:2015-06-04 11:47:41      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

题意: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

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46358443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!