dp定义为从当前房子开始可以抢到的最多的钱
base dp[n-1] = nums[n-1]
转移方程:对于每个房子1.抢2.不抢,抢下一个,只用考虑每个防止的当前状态,不用考虑他之前怎么做的选择
dp[i] = max(dp[i+1],dp[i+2]+nums[i]) 第一个是不抢,第二个是抢
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
""
n = len(nums)
res = nums[n-1]
dp_2 = 0
dp_1 = nums[n-1]
for i in range(n-2,-1,-1):
res = max(dp_1 , dp_2+nums[i])
dp_2 = dp_1
dp_1 = res
return res
也可以正着思考,dp定义为前i个房子最多可以抢多少钱
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#也可以正着思考,dp定义为前i个房子最多可以抢多少钱
n = len(nums)
dp = [0]*(n+1)
dp[1] = nums[0]
for i in range(2,n+1): #有一位偏移,因为dp[0]代表抢0个房子
dp[i] = max(dp[i-1],dp[i-2]+nums[i-1])
return dp[n]