您的位置:首页 > 其它

暑假-动态规划 III-D - FatMouse and Cheese

2015-08-19 11:09 260 查看
题意:有个n*n的迷宫,每个位置都有一定数量的cheese,每次只能从当前位置向(上,下,左,右)走1-k步,

并且下一个位置要比当前位置的cheese数量多。

问:现在老鼠从位置(0,0)出发,最多能获得多少cheese。

思路:记忆化搜索,递归。

#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 105;
int map[MAXN][MAXN]; 
//保存相应位置的cheese的数量
int dp[MAXN][MAXN];
//dp[i][j]表示从坐标(i,j)出发所能得到的cheese的最大值
int n, k;
//迷宫大小,步伐上限
int bfs(int x,int y)
{
	int nextx, nexty, maxval = 0,temp;
	//下一个位置的横坐标,纵坐标,整体最大值,临时最大值
	if (dp[x][y]!=-1)//记忆化搜索,如果已经算过,直接返回
	{
		return dp[x][y];
	}
	for (int i = 1; i <= k; i++)//步伐从1-k
	{
		nextx = x - i, nexty = y;//向上走
		if (nextx >= 0 && map[nextx][nexty] > map[x][y])
		{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
			temp = bfs(nextx, nexty);//更新这个方向的最大值
			if (temp > maxval)//更新整体最大值
			{
				maxval = temp;
			}
		}
		nextx = x + i, nexty = y;//向下走
		if (nextx < n && map[nextx][nexty] > map[x][y])
		{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
			temp = bfs(nextx, nexty);//更新这个方向的最大值
			if (temp > maxval)//更新整体最大值
			{
				maxval = temp;
			}
		}
		nextx = x, nexty = y - i;//向左走
		if (nexty >= 0 && map[nextx][nexty] > map[x][y])
		{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
			temp = bfs(nextx, nexty);//更新这个方向的最大值
			if (temp > maxval)//更新整体最大值
			{
				maxval = temp;
			}
		}
		nextx = x, nexty = y + i;//向右走
		if (nexty < n && map[nextx][nexty] > map[x][y])
		{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
			temp = bfs(nextx, nexty);//更新这个方向的最大值
			if (temp > maxval)//更新整体最大值
			{
				maxval = temp;
			}
		}
	}
	dp[x][y] = maxval + map[x][y];
	//整体最大值+原本位置的数目等于从x,y出发的最大值
	return dp[x][y];
}
int main()
{
	while (cin >> n >> k)
	{
		if (n == -1 && k == -1)
		{
			break;
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				cin >> map[i][j];
			}
		}
		memset(dp, -1, sizeof(dp));
		//初始化为-1,因为map[i][j]的值为0-100
		cout << bfs(0, 0) << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: