边工作边刷题: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]
posted @ 2016-05-20 07:32  absolute100  阅读(94)  评论(0编辑  收藏  举报