边工作边刷题:70天一遍leetcode: day 5
Dungeon Game
要点:
- 要区分点为单位或者边为单位,这题是点为单位
- dp思路很容易想,关键是具体的是什么:
- 优化目标?某点的生命值,限制条件:生命值不能低于1(与障碍物的题不同,障碍物是优化值取最差)
- 从目标点开始回溯到起点
- 所以最下一排和最后一列是特殊情况初始化
- 仔细看这题其实就是candy那题的2d版
错误点:
- 注意1的作用是防止体力最小值降为<=0
- 初始值除了和1比较还有别忘了+1。但递归式就不用了,因为前面计算好的dp肯定是>=1的
- 下和右边两个值要取min,因为是最小体力值,然后和1比较取max,而不是三者取max
class Solution(object):
def calculateMinimumHP(self, dungeon):
"""
:type dungeon: List[List[int]]
:rtype: int
"""
m = len(dungeon)
n = len(dungeon[0])
dp = [[0]*n for i in range(m)]
dp[m-1][n-1]=max(1, -dungeon[m-1][n-1]+1)
for _ in range(n-2, -1, -1):
dp[m-1][_]=max(1, dp[m-1][_+1]-dungeon[m-1][_])
for _ in range(m-2, -1, -1):
dp[_][n-1]=max(1, dp[_+1][n-1]-dungeon[_][n-1])
for i in range(m-2, -1, -1):
for j in range(n-2, -1, -1):
dp[i][j]=max(1, min(dp[i][j+1], dp[i+1][j])-dungeon[i][j])
return dp[0][0]