House Robber

严格上讲可能是序列型,但是因为当前房子抢与不抢的决策问题,感觉有点类似博弈类

普通版

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        dp = [0] * (n + 1)

        for i in xrange(1, n + 1):
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])

        return dp[n]

空间优化版

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

        if n < 2:
            return 0 if n == 0 else nums[0]

        dp = [0] * 2
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])

        for i in xrange(2, n):
            dp[i % 2] = max(dp[i % 2] + nums[i], dp[(i + 1) % 2])

        return dp[(n - 1) % 2]

House Robber II

目前知道的就是把环拆掉两次DP求解最大值,不知道还有没有其他方法

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        if n <= 1:
            return 0 if n == 0 else nums[0]

        left = [0] * n
        left[1] = nums[0]

        for i in xrange(2, n):
            left[i] = max(left[i - 1], left[i - 2] + nums[i - 1])

        right = [0] * n
        right[1] = nums[1]
        for i in xrange(2, n):
            right[i] = max(right[i - 1], right[i - 2] + nums[i])

        return max(left[-1], right[-1])

results matching ""

    No results matching ""