2024-09-01
算法刷题
00

在这里插入图片描述

https://leetcode-cn.com/problems/house-robber/solution/dong-tai-gui-hua-jie-ti-si-bu-zou-xiang-jie-cjavap/

作者:nettee

链接:https://leetcode-cn.com/problems/house-robber/solution/dong-tai-gui-hua-jie-ti-si-bu-zou-xiang-jie-cjavap/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

动态规划的的四个解题步骤是:

1 定义子问题

在这里插入图片描述

2 写出子问题的递推关系

在这里插入图片描述

在这里插入图片描述

3 确定 DP 数组的计算顺序

在这里插入图片描述

在这里插入图片描述

python
def rob(self, nums: List[int]) -> int: if len(nums) == 0: return 0 # 子问题: # f(k) = 偷 [0..k) 房间中的最大金额 # f(0) = 0 # f(1) = nums[0] # f(k) = max{ rob(k-1), nums[k-1] + rob(k-2) } N = len(nums) dp = [0] * (N+1) dp[0] = 0 dp[1] = nums[0] for k in range(2, N+1): dp[k] = max(dp[k-1], nums[k-1] + dp[k-2]) return dp[N] 作者:nettee 链接:https://leetcode-cn.com/problems/house-robber/solution/dong-tai-gui-hua-jie-ti-si-bu-zou-xiang-jie-cjavap/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4 空间优化(可选)

在这里插入图片描述

在这里插入图片描述

python
def rob(self, nums: List[int]) -> int: prev = 0 curr = 0 # 每次循环,计算“偷到当前房子为止的最大金额” for i in nums: # 循环开始时,curr 表示 dp[k-1],prev 表示 dp[k-2] # dp[k] = max{ dp[k-1], dp[k-2] + i } prev, curr = curr, max(curr, prev + i) # 循环结束时,curr 表示 dp[k],prev 表示 dp[k-1] return curr 作者:nettee 链接:https://leetcode-cn.com/problems/house-robber/solution/dong-tai-gui-hua-jie-ti-si-bu-zou-xiang-jie-cjavap/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!