1. 地下城游戏
思路
这道题从前往后要同时保证当前房间最低血量和路径最低血量。所以倒着来,从后往前,这样只需要保证房间最低学量,因为路径最低血量不管是多少都能到达最后终点(从终点来的)
动态转移方程:dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])−dungeon(i,j),1)
最终答案即为 dp[0][0]
边界条件为,dp[n−1][m−1] 转移需要用到的 dp[n-1][m]和 dp[n][m-1]均为无效值,因此我们给这两个值赋值为 1
这里 -dungeon[i][j]是因为:dp表示是需要的最低血量,当前房间血量是3,那么最低要求的血量就是-3,反之如果房间血量是-5,是说明要求勇士有更多血,所以最低血量还需要+5
PS:其实这题里面因为要求是正整数所以才max(…,1),换成0最后+1也一眼。
代码:
class Solution:
def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:
n, m = len(dungeon), len(dungeon[0])
BIG = 10**9
dp = [[BIG] * (m + 1) for _ in range(n + 1)]
dp[n][m - 1] = dp[n - 1][m] = 1
for i in range(n - 1, -1, -1):
for j in range(m - 1, -1, -1):
minn = min(dp[i + 1][j], dp[i][j + 1])
dp[i][j] = max(minn - dungeon[i][j], 1)
return dp[0][0]
时间复杂度:O(N×M),其中 N,MN,M 为给定矩阵的长宽。
空间复杂度:O(N×M),其中 N,MN,M 为给定矩阵的长宽,注意这里可以利用滚动数组进行优化,优化后空间复杂度可以达到 O(N)O(N)。
https://leetcode-cn.com/problems/dungeon-game/