leetcode174. 地下城游戏(java)
地下城游戏
- leetcode174. 地下城游戏
- 题目描述
- 动态规划
- 解题思路
- 代码
- 动态规划专题
leetcode174. 地下城游戏
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/dungeon-game
题目描述
恶魔们抓住了公主并将她关在了地下城 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
动态规划
解题思路
再找动态规划的转移方程时。
如果从头开始算。那么一路下来到右下角,我们要考虑两个问题:
一.是走到下一个格需要的最小血量
二是全路程走下来我们要走累加和最大的路径’。累加和越大需要的血量越少。
同时考虑两个问题,代码就变得很麻烦了,而且两个问题是两种优化,这两种优化可能会有冲突。
因此我们要换个思路,
从最后一个格往前推,在最后一个格需要多少血量.
如果Math.max(1 - dungeon(i,j),1).如果最后一格是不是负数,有1就好了,
这是最后一格的情况。
和前面联系到一起:那么转移方程就是:
dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])−dungeon(i,j),1)
把 1 - 1 - dungeon(i,j) 换成前面需要最小的血量去减。换成了min(dp[i+1][j],dp[i][j+1])−dungeon(i,j);
代码
public int calculateMinimumHP(int[][] dungeon) {int n = dungeon.length;int m = dungeon[0].length;int[][]dp = new int[n + 1][m + 1];for (int i = 0; i <= n; ++i) {Arrays.fill(dp[i], Integer.MAX_VALUE);}//走出最下角的格子,最少要有一的血量//把两个方向优化出来dp[n][m - 1] = 1;dp[n - 1][m] = 1;for(int i = n - 1;i >= 0;i--){for(int j = m - 1;j >= 0;j--){//上一次选择路线两个方向上最小值int min = Math.min(dp[i + 1][j],dp[i][j + 1]);//如果是整数 就取1 ,负数就取 min - dungeon[i][j]dp[i][j] = Math.max(min - dungeon[i][j],1);}}return dp[0][0];}
动态规划专题
打败怪兽的概率
leetcode688. 骑士在棋盘上的概率
凑零钱-钱币的组合有多少种II
最小路径和
最长回文子序列
数字转字符串,有多少种转化结果
leetcode.486. 预测赢家
走到指定位置有多少种方式
leetcode174. 地下城游戏(java)相关推荐
- LeetCode--174.地下城游戏(动态规划)
地下城游戏(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题是64.最小路径和的进阶版.但是这一题我们不能从左上向右下的顺序,而是**要 ...
- [算法]LeetCode每日一题--174. 地下城游戏(Java)
DailyChallenge 174. 地下城游戏 Hard20200712 Description 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格. ...
- 力扣LeetCode174.地下城游戏及Python源码实现
本题为LeetCode题库中第174题地下城游戏,难度困难,题目请参考这里. 一道比较困难DP题目,其中的难点在于如何定义状态转移方程,所以在这里记录一下.这道题刚开始做一点思路都没有,但是通过解读别 ...
- Leetcode--174. 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
- LeetCode174——地下城游戏
我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/dungeon-ga ...
- leetcode174. 地下城游戏(动态规划)
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
- 【普通人题解】LeetCode174. 地下城游戏
建议先看这个题 这个题 这个题,再看这个题. dfs 显然可以dfs,但是我们就不看了,因为大概率会超时. 动态规划 由于问题问初始的血量最低是多少,dp问题一般是最后一个状态作为输出值,所以对应的, ...
- LeetCode174. 地下城游戏
动态规划,用dp[i][j]表示第i行第j列的格子到终点所需的最小初始值,这题如果从左上往右下递推,就需要同时记录从起点到当前位置的路径和以及从起点到当前位置所需要的最小初始值,比较麻烦. 因此我们可 ...
- Java实现 LeetCode 174 地下城游戏
174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来 ...
最新文章
- 事关人类生存?为什么要探寻AI系统的可解释性?
- 铺地毯pascal程序
- 第一章:Java语言概述
- CNCC 技术论坛 | 知识图谱赋能数字经济
- icache的方面以及使用
- 【Java 基础】字符串(String、StringBuilder),日期(Date、SimpleDateFormat、Calendar)
- java 对文件名非法字符处理
- 三维激光LiDAR点云数据处理,我帮您!
- C#下对象与JSON串互相转换
- RISC-V MCU 自动浇花装置设计
- 基于PLC四层电梯模型控制系统课程设计
- PC版微信,公众号文章图片无法加载,解决方法
- 2022极米投影和米家投影哪个好 家用智能投影仪对比
- 初中计算机实践研究计划,项目式教学法在初中信息技术课堂教学中的研究与实践...
- 春招笔记(十一)--设计模式
- 湖南大学操作系统导论课程作业
- 将数据库的数据导入es中
- webRTC(二十四):web远程多台android的实现
- UltraISO Premium Edition9.7.1.3519完美破解版
- ElementUI使用表格如何显示图片?