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 @ 2025-02-13 10:39  ouyangxx  阅读(13)  评论(0)    收藏  举报