HDOJ 1078 记忆化搜索

本文通过动态规划方法解决了老鼠在移动过程中如何吃到最多的奶酪的问题。介绍了一个递归函数实现状态转移方程,利用备忘录技术避免重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: 点击打开链接

肥老鼠从(0,0)出发,每次最多水平或垂直移动K步(连续向同一方向),且移动停下的位置的cheese必须大于之前的,否则就被猫吃掉,求老鼠最多吃多少奶酪。
刚接触dp尝试分析一下,方便自己理解

dp[x][y]表示在从x,y出发移动k步最多可以吃到的奶酪数量 dp[x][y] = max(dp[nx][ny]+map[x][y],dp[x][y]);
    dp[nx][ny] 对应 dfs(nx,ny)  dp[x][y]开始为map[x][y] 如果 之后的值大于 map[x][y]则其会被更新,所以为了更新,用临时res代替map[x][y]
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAX 105
using namespace std;
int dp[MAX][MAX];
int n,k;
int map[MAX][MAX];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int dfs(int x, int y)
	{
		
		if(dp[x][y] != -1)
			return dp[x][y];
		int res = map[x][y];//dp[x][y]最少为map[x][y] 终点时候 就是此值
		for(int i = 0; i < 4; ++i){
			for(int j = 1; j <= k; ++j){
				int nx = x + j*dir[i][0];
				int ny = y + j*dir[i][1];
				if(nx>=0 && nx<n && ny>=0 &&ny<n && map[nx][ny] > map[x][y]){
					res = max(res,dfs(nx,ny)+map[x][y]);//就是状态转移方程的 搜索形式
				}
			}
		}
		return dp[x][y] = res;	
	}

int main()
	{
		std::ios::sync_with_stdio(false);//加快读取速度
		while(cin >> n >> k){
			if(n == -1 && k == -1)
				break;
			memset(dp,-1,sizeof(dp));
			memset(map,0,sizeof(map));
			
			for(int i = 0; i < n; ++i){
				for(int j = 0; j < n; ++j){
					cin >> map[i][j];
				} 
			}
			int ans = dfs(0,0);	
			cout << ans <<endl; 	
		}
		
		return 0;	
	} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值