解题思路:
先画树形结构去分析,【x,n】表示考虑从x到n范围内去偷盗,memo[x,n]表示x到n范围内偷盗金额的最大值。
def rob_198(nums):
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums[0], nums[1])
memo = [-1 for m in range(len(nums))]
memo[0] = nums[0]
memo[1] = max(nums[0],nums[1])
for i in range(2,len(nums)):
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
print(memo[-1])
return memo[-1]
解题思路:213在前一道题的基础上分别讨论第一个到n-1个商铺的最大值和第二个到n个商铺的最大值,最后取最大值即可。
def rob_213(nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums[0], nums[1])
memo = [-1 for m in range(len(nums))]
memo[0] = nums[0]
memo[1] = max(nums[0],nums[1])
for i in range(2,len(nums)-1):
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
res_1 = memo[-2]
print(memo)
memo = [-1 for m in range(len(nums))]
memo[1] = nums[1]
for i in range(2,len(nums)):
if i == 2:
memo[i] = max(nums[i] + 0, memo[i - 1])
else:
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
res_2 = memo[-1]
print(memo)
print(res_1,res_2)
print(max(res_1,res_2))
return max(res_1,res_2)