zoukankan      html  css  js  c++  java
  • 边工作边刷题: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]
    
  • 相关阅读:
    01:求平均年龄
    09:与圆相关的计算
    08:温度表达转化
    07:计算多项式的值
    06:甲流疫情死亡率
    05:计算分数的浮点数值
    04:带余除法
    03:计算(a+b)/c的值
    02:计算(a+b)*c的值
    01:A+B问题
  • 原文地址:https://www.cnblogs.com/absolute/p/5555008.html
Copyright © 2011-2022 走看看