代码随想录算法训练营第48天| 198. 打家劫舍、213.打家劫舍II、337.打家劫舍 III

198. 打家劫舍:


代码思路
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]

class Solution:
    def rob(self, nums: List[int]) -> int:
        # dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
        # 要么是偷i,要么是不偷i
        # 不偷i则
        # 那么dp[i] = dp[i-1]
        # 偷i则dp[i] = dp[i-2] + nums[i]
        if len(nums) == 1:
            return nums[0]
        dp = [0 for i in range(len(nums))]
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, len(nums)):
            dp[i] = max(dp[i-1], dp[i-2] + nums[i]) 
        return dp[-1]

213.打家劫舍II:


代码思路
三种情况,选第一个,或者选最后一个,或者都不选

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        if len(nums) == 2:
            return max(nums[0], nums[1])
        
        # 选第一个的情况
        dp = [0 for i in range(len(nums)-1)]
        nums_one = nums[:-1]
        if len(nums_one) == 1:
            max_one = nums_one[0]
        else:
            dp[0] = nums[0]
            dp[1] = max(nums[0], nums[1])            
            for i in range(2, len(nums_one)):
                dp[i] = max(dp[i-1], dp[i-2]+nums_one[i])
            max_one = dp[-1]

        # 选最后一个的情况
        dp = [0 for i in range(len(nums)-1)]
        nums_last = nums[1:]
        if len(nums_last) == 1:
            max_last = nums_last[0]
        else:
            dp[0] = nums[1]
            dp[1] = max(nums[1], nums[2])
            for i in range(2, len(nums_last)):
                dp[i] = max(dp[i-1], dp[i-2]+nums_last[i])
            max_last = dp[-1]


        # 两个都不选的情况
        dp = [0 for i in range(len(nums)-2)]
        nums_no = nums[1:-1]
        if len(nums_no) == 1:
            max_no = nums_no[0]
        elif len(nums_no) == 0:
            return 0
        else:
            dp[0] = nums[1]
            dp[1] = max(nums[1], nums[2])
            for i in range(2, len(nums_no)):
                dp[i] = max(dp[i-1], dp[i-2]+nums_no[i])
            max_no = dp[-1]
        return max([max_last,max_no,max_one])

你可能感兴趣的:(代码随想录打卡,算法,leetcode,动态规划)