HDU 1078 FatMouse and Cheese(记忆化搜索)

本篇介绍了一个基于记忆化搜索的算法问题,即FatMouse在一个n*n的地图上寻找并吃掉尽可能多的奶酪。通过实现递归搜索算法,并使用动态规划避免重复计算,确保了算法效率。

题目链接:点击打开链接

题意:n * n的地图,每个位置有若干奶酪,FatMouse初始位置在原点,每次可以跑向上下左右四个方向,距离原位置不超过k,而且下一个位置要比之前的位置的奶酪要多,到达一个位置就吃光该位置的奶酪,该过程直到FatMouse不能再移动为止,问FatMouse最多能吃多少奶酪?
思路:记忆化搜索,dp[i][j]表示在(i,j)位置出发,最多能吃的奶酪数;由于FatMouse每次只能去奶酪更多的位置,画画路径,分析分析,就可知,不存在由于之前路径不同,dp[i][j]不一样的情况,这点正好符合记忆化搜索的特征。

// HDU 1078 FatMouse and Cheese.cpp 运行/限制:62ms/1000ms
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int map[105][105];
int dp[105][105];
int next[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
int n, k;
int dfs(int x, int y) {
	if (dp[x][y] != -1) {
		return dp[x][y];
	}
	dp[x][y] = map[x][y];
	int re = 0;
	for (int i = 0; i < 4; i++) {
		for (int j = 1; j <= k; j++) {
			int xnext = x + ::next[i][0] * j;
			int ynext = y + ::next[i][1] * j;
			if (xnext >= 0 && xnext < n && ynext >= 0 && ynext < n && map[xnext][ynext] > map[x][y]) {
				dfs(xnext, ynext);
				re = max(re, dp[xnext][ynext]);
			}
		}
	}
	dp[x][y] += re;
	return dp[x][y];
}
int main() {
	while (scanf("%d%d", &n, &k) != EOF) {
		if (n == -1 && k == -1) {
			break;
		}
		memset(dp, -1, sizeof(dp));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &map[i][j]);
			}
		}
		printf("%d\n",dfs(0, 0));
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值