[LeetCode]House Robber II

House Robber II

题意:现在盗贼偷的房间围成了一个圆圈,但同样是不能偷相邻的两间房间,求偷的最大数目。

动态规划

分析:一开始,我想,既然是一个圆圈,那么就意味着在偷最后一位的时候,不仅仅要考虑到前一位有没有偷,还要考虑到第一位有没有偷,然后想通过判断,但是发现状态转移后无法去获知第一位的情况,后来发现其实我想得复杂了,可以把这个问题切分成两部分,一部分是从0到n-1,另一部分是从1到n-2,最后取这两种情况的最大值即可,这样就可以不用考虑最后一位的特殊情况了。

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        def rob_helper(start, end):
            rob, not_rob = 0, 0
            for i in range(start, end+1):
                cur_rob = not_rob + nums[i]
                not_rob = max(not_rob, rob)
                rob = cur_rob
            return max(rob, not_rob)
        if not nums:
            return 0
        elif len(nums) <= 2:
            return max(nums)
        return max(rob_helper(1, len(nums)-1), rob_helper(0, len(nums)-2))
posted @ 2017-08-29 13:21  banananana  阅读(131)  评论(0)    收藏  举报