DP错题总结

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值