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]
最后更新于