你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家;如果偷了第二家,那么就不能偷第一家和第三家。 给定一个整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。 思路: 如果房屋数量大于两间: 偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。 不偷窃第 k 间房屋,偷窃总金额为前 k−1 间房屋的最高总金额。 在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。 状态转移方程: 用 dp[i] 表示前 i 间房屋能偷窃到的最高总金额,dp[i]=max(dp[i−2]+nums[i],dp[i−1])

class Solution:
    def rob(self , nums: List[int]) -> int:
        # write code here
        if len(nums)==1:return nums[0]
        if len(nums)==2:return max(nums)
        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-2]+nums[i],dp[i-1])
        return dp[-1]