问题描述:

一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报。


建模:

给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值。


思路:动态规划

如果输入是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]