动态规划_leetcode213

class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""


if not nums:
return 0

length = len(nums)

if length == 1:
return nums[0]
if length == 2:
return max(nums[0],nums[1])
if length == 3:
return max(nums[0],nums[1],nums[2])


# memo[i]考虑偷 nums[i,n]的箱子
memo = [-1 for i in range(length)]

memo[length-1] = nums[length-1]

for i in range(length-2,0,-1):
for j in range(i,length):

if j+2 < length:
memo[i] = max(memo[i],nums[j] + memo[j+2])
else:
memo[i] = max(memo[i],nums[j])



# 原问题分解为 偷两边 比较 memo[1] 和 memo[0] 的最优值
# 注意 memo[1] 的范围是 nums[1,n-1]
# memo[0] 的范围是 nums[2,n-2]
validValue = memo[1]

for i in range(length):

memo[i] = -1

memo[length-2] = nums[length-2]

for i in range(length-3,-1,-1):
for j in range(i,length-1):
if j+2 < length-1:
memo[i] = max(memo[i],nums[j] + memo[j+2])
else:
memo[i] = max(memo[i],nums[j])


return max(memo[0],validValue)


s = Solution()

# nm = [1,2,3,1]
nm = [8,2,8,9,2]

print s.rob(nm)

转载于:https://www.cnblogs.com/lux-ace/p/10546527.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值