动态规划,递归&记忆化
leetcode 198题
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
链接:https://leetcode-cn.com/problems/house-robber
x=[183,219,57,193,94,233,202,154,65,240,97,234,100,249,186,66,90,238,168,128,177,235,50,81,185,165,217,207,88,80,112,78,135,62,228,247,211]
class Solution:
def rob(self, nums: List[int]) -> int:
'''动态规划,自底向下'''
if len(nums)==0:
return 0
else:
result=[0]*(len(nums)+1)
result[0]=0
result[1]=nums[0]
for i in range(2,len(nums)+1):
result[i]=max(result[i-1],result[i-2]+nums[i-1])
return result[-1]
def rob_2(nums) -> int:
'''递归,自顶向下'''
if len(nums)<=2:
if len(nums)==0:
return 0
return max(nums)
else:
temp1=nums[-1]+rob_2(nums[0:-2])
temp2=rob_2(nums[0:-1])
return max(temp1,temp2)
def rob(nums,fig) -> int:
'''递归&记忆化'''
if len(nums)<=2:
if len(nums)==0:
return 0
return max(nums)
else:
if fig[len(nums)]>0:
return fig[len(nums)]
else:
temp1=nums[-1]+rob(nums[0:-2],fig)
temp2=rob(nums[0:-1],fig)
rob_max=max(temp1,temp2)
fig[len(nums)]=rob_max
return rob_max