题目链接:点击打开链接
题意: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;
}

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

1128

被折叠的 条评论
为什么被折叠?



