问题描述:
一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报。
建模:
给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值。
思路:动态规划
如果输入是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]
时间: 2024-10-06 20:06:24