打家劫舍系列问题--Python3--动态规划

打家劫舍系列问题--Python3--动态规划_第1张图片

打家劫舍一:

先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

如果房屋数量K>2 ,那么从第三个房屋开始,如何取得金额的最大值呢?{
第一种情况 :如果该房屋选择偷窃,则前一个房屋不可偷窃,
那么总金额的最大值为 前K-2间房屋最大金额+该房屋的金额

第二种情况:如果该房屋不偷窃,那么总金额的最大数为前K-1间房屋所得金额
}
使用一个dp数组来储存当前最大所得金额
那么状态转移方程
K>2 dp[k] = max(dp[k-1] , dp[k-2] + nums[k])

下面给一个出具体变化的过程
打家劫舍系列问题--Python3--动态规划_第2张图片

打家劫舍系列问题--Python3--动态规划_第3张图片

打家劫舍系列问题--Python3--动态规划_第4张图片

打家劫舍系列问题--Python3--动态规划_第5张图片

附上代码:

def rob(self, nums: List[int]) -> int:
    dp = [0] * len(nums)
    # 三个特判
    if len(nums) == 0:
        return 0
    if len(nums) == 1 :
        return nums[0]
    if len(nums) == 2:
        return max(nums[0] , nums[1])

    for i in range(len(nums)):
        dp[i] = max((dp[i-2] + nums[i]) , dp[i-1])
    return max(dp)

下次再写打家劫舍二和三。感谢!

你可能感兴趣的:(动态规划)