问题描述:
一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报。
建模:
给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值。
思路:动态规划
如果输入是v1v2...vm,用S[i]表示从v1v2...vi能偷到的最大价值。
递归子问题:S[i] = max(S[i-1], vi + S[i-2])
初如条件:S[0] = 0 S[1] = v1 S[2] = max(S[1], v2 + S[0])
代码:Python
class Solution:
# @param num, a list of integer
# @return an integer
def rob(self, num):
n = len(num)
if n == 0:
return 0
elif n == 1:
return num[0]
else:
s = [0 for i in range(n)]
s[0] = num[0]
s[1] = max(num[0], num[1])
for i in range(2,n):
s[i] = max(s[i-1], s[i-2] + num[i])
return s[n-1]
转载于:https://blog.51cto.com/koala87/1627134