当前位置:网站首页>LeetCode刷题系列-- 174. 地下城游戏
LeetCode刷题系列-- 174. 地下城游戏
2022-07-24 09:08:00 【在河之洲木水】
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。
编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。
例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。
-2 (K) -3 3
-5 -10 1
10 30 -5 (P)
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/dungeon-game
大佬的链接:动态规划帮我通关了《魔塔》 :: labuladong的算法小抄
思路:
此题与前面的 64. 最小路径和 为同一类型题,但是也有不同。
定义二维数组 dp[][] ,dp[i][j] 表示从grid[i][j] 到右下角所需的最少血量。
设 grid 数组的行数为 rowLen, 列数为 colmLen
1. dp[i][j] 的值与 dp[i][j+1] 与 dp[i+1][j] 有关,选择两者中值最小的路继续走,
2.
2.1) 若是 grid[i][j] 为负数,则 dp[i][j] = min(dp[i][j+1],dp[i+1][j]) - grid[i][j]
2.2) 若是 grid[i][j] 为正数时,
2.2.1) 若是 grid[i][j] >= min(dp[i][j+1],dp[i+1][j]), 那么dp[i][j] = 1 即可,
即保证从其他位置到 grid[i][j] 后,血量值为1 即可,剩下血量值就由 grid[i][j] 来补充
2.2.2) 若是 grid[i][j] < min(dp[i][j+1],dp[i+1][j]), 那么dp[i][j] = min(dp[i][j+1],dp[i+1][j]) - grid[i][j],
即到达 grid[i][j] 时,其血量需要最小为 min(dp[i][j+1],dp[i+1][j]) - grid[i][j] 既可以,余下血量由 grid[i][j] 补充
具体步骤如下:
1. 初始化
1.1 dp[rowLen-1][colmLen-1] = grid[rowLen-1][colmLen-1]>=0?1:-grid[rowLen-1][colmLen-1] + 1,
若是 grid[rowLen-1][colmLen-1] 为正数,表示到达最右下角前其血量至少为1即可;若是 grid[rowLen-1][colmLen-1] 为负数,表示到达最右下角前其血量至少为比扣除血量大 1 即可
1.2 求解 dp[rowLen-1][j]
dp[rowLen-1][j] = dp[rowLen-1][j+1] - grid[rowLen-1][j]
若是 dp[rowLen-1][j] <=0 ,则 dp[rowLen-1][j] = 1 ,说明 grid[rowLen-1][j] 的补血量够大,所以到达该节点时,血量为 1 就够用了
1.3 求解 dp[i][colmLen-1]
dp[i][colmLen-1] = dp[i+1][colmLen-1] - grid[i][colmLen-1]
若是 dp[i][colmLen-1] <=0 ,则 dp[i][colmLen-1] = 1 ,说明 grid[i][colmLen-1] 的补血量够大,所以到达该节点时,血量为 1 就够用了
2. 状态转移方程:
对于dp[i][j]
dp[i][j] = min(dp[i+1][j],dp[i][j]) = grid[i][j],
2.1) 如果 dp[i][j] <= 0 , dp[i][j] = 1, 说明grid[i][j] 的补血量足够大,所以到达该节点时,血量为 1 就够用了
3. 返回dp[0][0]java:
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int rowLen = dungeon.length;
int colmLen = dungeon[0].length;
// dp[i][j] 表示从 grid[i][j] 到右下角所需的最少血量
int[][] dp = new int[rowLen][colmLen];
dp[rowLen - 1][colmLen - 1] = dungeon[rowLen - 1][colmLen - 1] >= 0 ? 1 : -dungeon[rowLen - 1][colmLen - 1] + 1;
// 1. 初始化
for (int i = rowLen - 2; i >= 0; i--) {
dp[i][colmLen - 1] = dp[i + 1][colmLen - 1] - dungeon[i][colmLen - 1];
if (dp[i][colmLen - 1] <= 0) {
dp[i][colmLen - 1] = 1; // 说明 grid[i][colmLen - 1] 的补血量够大,所以到达该节点时,血量为 1 就够用了
}
}
for (int j = colmLen - 2; j >= 0; j--) {
dp[rowLen - 1][j] = dp[rowLen - 1][j + 1] - dungeon[rowLen - 1][j];
if (dp[rowLen - 1][j] <= 0) {
dp[rowLen - 1][j] = 1; // 说明 grid[rowLen-1][j] 的补血量够大,所以到达该节点时,血量为 1 就够用了
}
}
// 2. 状态转移方程
for (int i = rowLen - 2; i >= 0; i--) {
for (int j = colmLen - 2; j >= 0; j--) {
dp[i][j] = Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];
if(dp[i][j]<=0) {
dp[i][j] = 1; // 说明 grid[i][j] 的补血量够大,所以到达该节点时,血量为 1 就够用了
}
}
}
return dp[0][0];
}
}边栏推荐
- How do tiktok merchants bind the accounts of talents?
- office回退版本,从2021到2019
- After watching the documentary "pirate treasure on Adak Island", I thought of the lost treasure in Chinese history
- 超全总结:Go语言如何操作文件
- PIP3 installation complete with source
- [assembly language practice] solve the unary quadratic equation ax2+bx+c=0 (including source code and process screenshots, parameters can be modified)
- Office fallback version, from 2021 to 2019
- Shell script backup mongodb database
- VGA character display based on FPGA
- One year after I came to Ali, I ushered in my first job change
猜你喜欢

Account 1-3

The difference between & &, | and |

Interviewer: man, how much do you know about the read-write lock of go language?

xtrabackup 实现mysql的全量备份与增量备份

Linked list - 24. Exchange nodes in the linked list in pairs

Houdini 官方HDA SideFX Labs 安装

OpenCV中文文档4.0.0学习笔记(更新中……)

dp最长公共子序列详细版本(LCS)

TCP triple handshake connection combing

Data collection solution for forestry survey and patrol inspection
随机推荐
Six pictures show you why TCP shakes three times?
Developing ebpf program with go language
超全总结:Go语言如何操作文件
链表——19. 删除链表的倒数第 N 个结点
剑指 Offer II 024. 反转链表
[FFH] openharmony gnawing paper growth plan -- Application of cjson in traditional c/s model
TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2
Publish your own library on NPM
Android system security - 5.3-apk V2 signature introduction
mysql URL
科目1-3
【汇编语言实战】(二)、编写一程序计算表达式w=v-(x+y+z-51)的值(含代码、过程截图)
Houdini official HDA sidefx labs installation
Promise basic summary
Unity解决Package Manager“You seem to be offline”
Unity C tool class arrayhelper
【FFH】实时聊天室之WebSocket实战
What is tiktok creator fund and how to withdraw it?
分类与回归的区别
Houdini notes