213. 打家劫舍 II
- 题目链接
 - 解题思路:来到index位置,决定偷,或者不偷。但是有一个问题,来到最后一个位置的时候,可以偷吗?因为房屋是一个圆圈,如果第一个位置偷了,那么最后一个位置就不能偷,那么暴力递归时,怎么知道呢?
 
- 
- 将问题解耦成两个问题,第一个房间偷+第一个房间不偷。第一个房间偷,那么最后一个房间必不能偷;第一个房间偷最后一个房间就可以考虑偷
 - 暴力递归加上记忆化搜索表,就是动态规划了。
 
 
- 
代码
 - 
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) 
                    
                
                
            
        
浙公网安备 33010602011771号