【力扣】地下城游戏

devtools/2024/9/23 20:25:06/

🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于知识分享,与更多的人进行学习交流

恶魔们抓住了公主并将她关在了地下城 dungeon右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快解救公主,骑士决定每次只 向右向下 移动一步。

返回确保骑士能够拯救到公主所需的最低初始健康点数。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

示例 1:

输入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]
输出:7
解释:如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7 。

示例 2:

输入:dungeon = [[0]]
输出:1

提示:

  • m == dungeon.length
  • n == dungeon[i].length
  • 1 <= m, n <= 200
  • -1000 <= dungeon[i][j] <= 1000

二维动态规划倒推

思路

根据题目的条件可以定义dp[i][j],表示从左上角到达(i,j)个格子,需要的最低初始血量,但是这样难以确定状态转移方程,因为每次要保证剩余的血量最多以便后续的移动,同时要保证需要的初始血量最少,涉及两个状态转移方程

逆向推导,dp[i][j]表示从(i,j)到达右下角所需要的最低初始血量。

如果是向右移动的话:dp[i][j] + w >= dp[i][j + 1]

如果是向下移动的话:dp[i][j] + w >= dp[i + 1][j]

所以状态转移方程 dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - w;

同时为了保证血量大于0,还需要在dp[i][j]和1中取最大值

代码实现

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int m = dungeon.size(), n = dungeon[0].size();vector<vector<int>> dp(m + 1, vector(n + 1, INT_MAX));dp[m][n - 1] = dp[m - 1][n] = 1;for (int i = m - 1; i >= 0; --i) {for (int j = n - 1; j >= 0; --j) {dp[i][j] = min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j];dp[i][j] = max(dp[i][j], 1);}}return dp[0][0];}
};

http://www.ppmy.cn/devtools/100167.html

相关文章

浅谈【数据结构】树与二叉树二

目录 1、二叉排序树 1.1二叉树排序树插入 1.1.1两种插入方法 1.1.2循环法 1.1.3递归法 1.2二叉树的打印 1.3二叉树的结点删除 1.4销毁二叉树 1.5层次打印 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&…

SSD Fresh:固态硬盘优化专家

在追求高性能计算体验的今天&#xff0c;固态硬盘&#xff08;SSD&#xff09;已成为提升系统响应速度的关键组件。然而&#xff0c;如何有效延长SSD的使用寿命&#xff0c;同时保持其最佳性能&#xff0c;是许多技术爱好者和专业人士面临的问题。今天&#xff0c;电脑天空为大…

Postman之Newman命令以及常用参数

Newman介绍 Postman是专为接口测试而生&#xff0c;而Newman是专为Postman而生。因为服务器一般都是Linux系统&#xff0c;而前文提到的操作都离不开Postman的客户端&#xff0c;为解决这个问题&#xff0c;谷歌公司引入了 Newman工具。Newman是Postman的命令行&#xff0c;是…

129页《战略推演:获取竞争优势的思维与方法》

知识星球APP搜索【战略咨询文库】&#xff0c;下载700多份资料 一、战略思维 差异化战略 产品或服务差异化&#xff1a;通过提供独特的产品特性、功能、设计或品质&#xff0c;满足特定客户群体的需求&#xff0c;从而与竞争对手区分开来。例如&#xff0c;苹果公司以其创新…

暑期算法训练

目录 A.糖果&#xff08;Candy) B.小红的数组重排 C.牛牛与LCM D.子串 E.勤奋的杨老师 F.清楚姐姐跳格子 G.方块 I H.PUBG A.糖果&#xff08;Candy) 思路 &#xff1a;贪心&#xff0c;为了使操作数最少&#xff0c;我们要尽可能的先吃第二个盒子里的糖果&#x…

初识redis:Zset有序集合

Set作为集合&#xff0c;有两个特点&#xff1a;唯一且无序。 Zset是有序集合&#xff0c;在保证唯一的情况下&#xff0c;是根据什么来排序的呢&#xff1f;排序的规则是什么&#xff1f; Zset中的member引入了一个属性&#xff0c;分数&#xff08;score&#xff09;&#…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一…

Github 2024-08-25 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30824 个Fork数量:1052…