当前位置: 首页 > news >正文

[Java恶补day50] 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


知识点:
dp、逆向


解:
核心思路:
由于骑士到达公主位置(到右下角格子)时,血量至少需要1,故设置边界条件,将矩阵的外边的右边、下边分别标记为1。
由于只能向右、向下移动,因此从当前格子出发到达终点所需的最少血量,取决于右边那个格子、下边那个格子的dp值,两者取min
这个min-当前格子的dp值=当前格子的血量

时间复杂度:O(m×n)。
空间复杂度:O(m×n)。

class Solution {public int calculateMinimumHP(int[][] dungeon) {//使用动态规划//获取二维矩阵的行数、列数int m = dungeon.length;int n = dungeon[0].length;//dp数组(从(i,j)出发到达终点所需的最小初始生命值)int[][] dp = new int[m + 1][n + 1];//初始化dp数组for (int i = 0; i <= m; i++) {// 每行填充为最大intArrays.fill(dp[i], Integer.MAX_VALUE);}//设置边界条件(到达公主位置后,骑士至少需要1点生命值才能存活)dp[m][n - 1] = dp[m - 1][n] = 1;//逆向dp,遍历矩阵进行判断for (int i = m - 1; i >= 0; i--) {for (int j = n - 1; j >= 0; j--) {//获取从当前位置向右或向下走所需的最小生命值int min = Math.min(dp[i + 1][j], dp[i][j + 1]);//当前位置对生命值的影响、1的最大值,表示该位置生命值dp[i][j] = Math.max(min - dungeon[i][j], 1);}}//从左上角出发return dp[0][0];}
}

参考:
1、官方题解

http://www.dtcms.com/a/336538.html

相关文章:

  • 数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)
  • 数学建模 13 SVM 支持向量机
  • 原子操作及基于原子操作的shared_ptr实现
  • PYTHON让繁琐的工作自动化-PYTHON基础
  • 【撸靶笔记】第五关:GET - Double Injection - Single Quotes - String
  • 基于STM32单片机智能RFID刷卡汽车位锁桩设计
  • Qt同步处理业务并禁用按钮
  • linux系统------kubenetes单机部署
  • LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组
  • 5G虚拟仿真平台
  • [激光原理与应用-292]:理论 - 波动光学 - 驻波的本质是两列反向传播的相干波通过干涉形成的能量局域化分布
  • 安全多方计算(MPC)简述
  • Compose笔记(四十六)--Popup
  • Houdini 粒子学习笔记
  • 服装外贸管理软件 全流程优化解决方案
  • 学习记录(二十)-Overleaf如何插入参考文献
  • Chrome 插件开发实战:从入门到上架的全流程指南
  • 最长回文子串问题:Go语言实现及复杂度分析
  • 63.不同路径
  • Django前后端交互实现用户登录功能
  • 计算机网络---跳板机与堡垒机
  • Centos 更新/修改宝塔版本
  • 第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!
  • 点云的PFH 和 FPFH特征
  • k8sday09
  • C# 反射和特性(自定义特性)
  • 股票术语:“支撑位”
  • 解码词嵌入向量的正负奥秘
  • 一张图总结 - AI代理上下文工程:构建Manus的经验教训
  • Python多线程、锁、多进程、异步编程