【动态规划】leetcode198.打家劫舍

题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
【动态规划】leetcode198.打家劫舍_第1张图片

解答:
【方法一】:
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
第i间房屋,要么偷,要么不偷

  • 偷:dp[i]=dp[i-2]+nums[i]
  • 不偷:dp[i]=dp[i-1]

求两种情况下的最大值,dp[i]=max(dp[i-2]+nums[i]], dp[i-1])

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

【方法二】

class Solution:
    def rob(self, nums: List[int]) -> int:
        #dp[i][0]:偷前i间房屋所能获得的最高金额,0代表不偷,1代表偷
        n=len(nums)
        dp=[[0]*2 for _ in range(n)]
        dp[0][1]=nums[0]
        for i in range(1,n):
            dp[i][0]=max(dp[i-1])
            dp[i][1]=dp[i-1][0]+nums[i]
        return max(dp[n-1])

你可能感兴趣的:(leetcode,Python,leetcode,动态规划,算法)