174-地下城游戏

题目

恶魔们抓住了公主并将她关在了地下城 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

思路

问题描述:地下城由一个m x n的网格组成,骑士从左上角出发,必须通过对抗恶魔来拯救公主,目标是找到骑士进入地下城所需的最低初始健康点数。

解题思路:
这是一个动态规划问题。我们可以从右下角开始逆向考虑,定义 dp[i][j] 为从位置 (i, j) 到达右下角时所需的最低初始健康点数。为了逆向推导,我们从右下角开始向左上角遍历。

  • 对于最后一行和最后一列,只能往右或往下移动,因此需要考虑从当前位置 (i, j) 出发的下一个位置 (i+1, j)(i, j+1),并且需要保证 dp[i][j] 大于等于1。
  • 对于其他位置,我们需要考虑向右或向下移动,并且选择路径中的最小初始健康点数。因此,dp[i][j] 取决于 (i+1, j)(i, j+1) 中的较小值,且需要保证 dp[i][j] 大于等于1。

最终,初始健康点数应该大于等于 dp[0][0]

代码

object Solution {def calculateMinimumHP(dungeon: Array[Array[Int]]): Int = {val m = dungeon.lengthval n = dungeon(0).lengthval dp = Array.ofDim[Int](m, n)dp(m - 1)(n - 1) = math.max(1, 1 - dungeon(m - 1)(n - 1))for (i <- m - 2 to 0 by -1) {dp(i)(n - 1) = math.max(1, dp(i + 1)(n - 1) - dungeon(i)(n - 1))}for (j <- n - 2 to 0 by -1) {dp(m - 1)(j) = math.max(1, dp(m - 1)(j + 1) - dungeon(m - 1)(j))}for (i <- m - 2 to 0 by -1) {for (j <- n - 2 to 0 by -1) {dp(i)(j) = math.max(1, math.min(dp(i + 1)(j), dp(i)(j + 1)) - dungeon(i)(j))}}dp(0)(0)}def main(args: Array[String]): Unit = {val dungeon1 = Array(Array(-2, -3, 3), Array(-5, -10, 1), Array(10, 30, -5))println(calculateMinimumHP(dungeon1))  // 输出 7val dungeon2 = Array(Array(0))println(calculateMinimumHP(dungeon2))  // 输出 1}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui中的el-table合并单元格

描述&#xff1a; 在写项目的时候有时候会经常遇到把行和列合并起来的情况&#xff0c;因为有些数据是重复渲染的&#xff0c;不合并行列会使表格看起来非常的混乱&#xff0c;如下&#xff1a; 而我们想要的数据是下面这种情况&#xff0c;将重复的行进行合并&#xff0c;使表…

升级Go 版本到 1.19及以上,Goland: file.Close() 报错: Unresolved reference ‘Close‘

错误截图 解决方法 File -> Settings -> Go -> Build Tags & Vendoring -> Custom tags -> 添加值 “unix” 原因 Go 1.19 引入了unix构建标签。因此&#xff0c;需要添加unix到自定义标签。 参考 https://blog.csdn.net/weixin_43940592/article/det…

any、unknown、never 和 void区别

any 类型&#xff1a; any 类型是 TypeScript 中的顶级类型&#xff0c;它可以接受任何类型的值&#xff0c;相当于取消了类型检查。 当将变量声明为 any 类型时&#xff0c;可以赋予它任何值&#xff0c;无论是数字、字符串、布尔值还是其他类型的值。 使用 any 类型可能会降…

MySql增量恢复

一、 使用二进制日志的时间点恢复 注意 本节和下一节中的许多示例都使用mysql客户端来处理mysqlbinlog生成的二进制日志输出。如果您的二进制日志包含\0&#xff08;null&#xff09;字符&#xff0c;那么mysql将无法解析该输出&#xff0c;除非您使用--binary模式选项调用它。…

高速收费站的智慧之选,工控机助力顺畅通行!

2020年初取消高速公路省界收费站后&#xff0c;全国高速公路进入“一张网运行、一体化服务”的新阶段。随着ETC用户量快速增长、驾乘人员对收费站高效通行需求不断提升&#xff0c;收费数据在线化运营及精准化、智能化、人性化的收费服务将成为主流。如何提高收费系统集成度、降…

软考高级系统架构设计师系列论文八十五:论软件产品线技术

软考高级系统架构设计师系列论文八十五:论软件产品线技术 一、摘要二、正文三、总结一、摘要 根据“十五”国防科技重点实验室—“机载XXPD火控雷达性能开发与评估实验室”的建设需求。我所在的中国x集团公司x所电子对抗研究部组织了用于该实验室目布式联网试验,主要任务是试…

h5逻辑_调用手机拨号功能

有时点击页面某个按钮&#xff0c;希望能掉起手机拨号页&#xff0c;实现步骤如下&#xff1a; [1] 在index.html中添加如下代码<meta name"format-detection" content"telephoneyes" />[2] 点击按钮调用函数callPhone (phoneNumber) {window.locat…

Java与Modbus-TCP/IP网络通讯

1.需求样例 举例5&#xff1a;浮点数参数读取&#xff08;读取温度测量值&#xff09;查看参数列表&#xff0c;温度测量值地址为320&#xff0c;根据Modbus协议&#xff0c;读取参数地址转换为16进制为&#xff1a;00H A0H&#xff0c;读取长度为2个字&#xff1a;00H 02H。 …

腾讯云服务器价格表大全_轻量服务器_CVM云服务器报价明细

腾讯云服务器租用费用表&#xff1a;轻量应用服务器2核2G4M带宽112元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天&#xff0c;腾讯云服务器网长期更新腾讯云轻量…

在Ubuntu上启动一个简单的用户登录接口服务

一个简单的用户登录接口 我使用 Python 和 Flask 框架来创建这个接口 首先&#xff0c;确保你已经安装了 Python 和 Flask。如果没有安装&#xff0c;可以通过以下命令在 Ubuntu 上安装&#xff1a; sudo apt update sudo apt install python3 python3-pip pip3 install Fla…

KASLR 内核随机地址配置开启

CONFIG_RANDOMIZE_BASE kernel features ---> Randomize of module region independently from the core kernel 参考链接&#xff1a;KASLR 内核动态地址 - kk Blog —— 通用基础 (abcdxyzk.github.io)

5G网关如何提升智慧乡村农业生产效率

得益于我国持续推进5G建设&#xff0c;截至今年5月&#xff0c;我国5G基站总数已达284.4万个&#xff0c;覆盖全国所有地级市、县城城区和9成以上的乡镇镇区&#xff0c;实现“镇镇通5G”&#xff0c;全面覆盖了从城市到农村的延伸。 依托5G网络的技术优势&#xff0c;智慧乡村…

5.6.webrtc三大线程

那今天呢&#xff1f;我们来介绍一下web rtc的三大线程&#xff0c;那为什么要介绍这三大线程呢&#xff1f;最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢&#xff1f;我们就知道其他线程与它们之间是怎样关系&#xf…

机器学习之Adam(Adaptive Moment Estimation)自适应学习率

Adam&#xff08;Adaptive Moment Estimation&#xff09;是一种常用的优化算法&#xff0c;特别适用于训练神经网络和深度学习模型。它是一种自适应学习率的优化算法&#xff0c;可以根据不同参数的梯度信息来动态调整学习率&#xff0c;以提高训练的效率和稳定性。 Adam算法…

如何提取视频的音频到手机?这个音频提取方法很简单

提取视频中的音频可以帮助您获得视频的声音部分&#xff0c;而无需观看整个视频。这对于那些只想听视频的声音或想将视频的声音与其他音频内容混合使用的人来说非常方便。此外&#xff0c;提取音频也可以为需要创建音频剪辑或混音的音频制作者提供帮助。那么怎么提取呢&#xf…

Java接入支付宝支付

本文只接入了支付宝中的APP支付&#xff0c;如果要拓展更多支付方式的的话&#xff0c;请看文末补充 项目支付流程 前端发起创建订单请求后端接受请求创建订单&#xff0c;并将订单参数进行支付宝对应签名并返回前端拿到签名后调起支付宝支付 本文主要写的就是2的过程 前期准…

报名倒计时!| 基于RflySim平台飞控底层算法开发专题培训(第二期)

RflySim 暑期学校 飞思实验室“基于RflySim平台飞控底层算法开发”系列专题培训第二期开启报名了&#xff01;专题培训由戴训华副教授以及飞思实验室学生&工程师团队主讲&#xff0c;采用“线上线下”集中授课形式&#xff0c;培训时间为8月28日-9月3日&#xff1b;课程内…

基于XL32F003单片机的可控硅调光方案

可控硅调光是一种用于调节电源输出电压的技术&#xff0c;被广泛应用于各种场景。它主要通过改变波形的导通角度来调节输出电压的大小&#xff0c;从而实现对照明设备亮度的控制。在照明市场占据了很大的调光市场。 可控硅调光的兼容性强&#xff0c;应用范围广。例如&#xff…

2023科隆游戏展:虚幻5游戏百花齐放,云渲染助力虚幻5高速渲染

8月23日&#xff0c;欧洲权威级游戏展示会——科隆游戏展拉开帷幕。今年的参展游戏也相当给力&#xff0c;数十款游戏新预告片在展会上公布&#xff0c;其中有不少游戏使用虚幻5引擎制作&#xff0c;开创了游戏开发新纪元。 虚幻5游戏百花齐放&#xff0c;渲染堪比电影级效果 …

数学软件和编程环境Mathematica 13 「mac」

Mathematica 13是一种强大的计算机代数系统和编程环境&#xff0c;它提供了广泛的数学功能和符号计算能力&#xff0c;可以进行高级数值计算、数据分析、可视化和模拟等任务。 Mathematica使用自己的独特的程序语言&#xff0c;称为Wolfram语言&#xff0c;它结合了函数式编程、…