198. 打家劫舍

https://leetcode-cn.com/problems/house-robber/

解法一:dp

用一个dp数组一次遍历解决,dp[i]表示到i处取得的最大值。因为不能偷相邻的,所以dp[i]只有两个来源:若偷i处,则不能取dp[i-1](相邻限制),只能取dp[i-2];若不偷i处,则可以取dp[i-1],从两个来源中取较大的。方程:

dp[i] = max(dp[i-1], dp[i-2]+nums[i])

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        #边界
        if n == 0:
            return 0
        if n == 1:
            return nums[0]
        #初始化
        dp = [0] * n
        dp[0] = nums[0]
        dp[1] = nums[1] if nums[1] > nums[0] else nums[0]
        if n == 2:
            return dp[n-1]
        
        for i in range(2, n):
            dp[i] = max(dp[i-1], dp[i-2]+nums[i])
        return dp[n-1]

最后更新于