213. 打家劫舍 II

  1. 题目链接
  2. 解题思路:来到index位置,决定偷,或者不偷。但是有一个问题,来到最后一个位置的时候,可以偷吗?因为房屋是一个圆圈,如果第一个位置偷了,那么最后一个位置就不能偷,那么暴力递归时,怎么知道呢?
    • 将问题解耦成两个问题,第一个房间偷+第一个房间不偷。第一个房间偷,那么最后一个房间必不能偷;第一个房间偷最后一个房间就可以考虑偷
    • 暴力递归加上记忆化搜索表,就是动态规划了。
  1. 代码

  2. class Solution:

    # 来到index位置,决定偷不偷,终止位置是n。
    def process(self, nums: List[int], index: int, dp: List[int], n: int) -> int:
    if index >= n:
    return 0
    if dp[index] != -1:
    return dp[index]
    # 偷
    yes = nums[index] + self.process(nums, index + 2, dp, n)
    # 不偷
    no = self.process(nums, index + 1, dp, n)
    dp[index] = max(yes, no)
    return dp[index]
    def rob(self, nums: List[int]) -> int:
    n = len(nums)
    dp = [-1 for i in range(n)]
    dp2 = [-1 for i in range(n)]
    # 第一家偷 终止位置就是n-1
    yes = nums[0] + self.process(nums, 2, dp, n - 1)
    # 第一家不偷 终止位置就是n
    no = self.process(nums, 1, dp2, n)
    return max(no, yes)
posted @   ouyangxx  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示