python-Leetcode算法题213

题目:

python-Leetcode算法题213_第1张图片

思路:区别于题198,这道题首尾相接,不可以同时偷第一个和最后一个房子,即选首不选尾,选尾不选首。

分成了两部分,一部分是[1:]另一部分是[:-1]也就是一个不算首,一个不算尾,然后再取两者最大值即可

状态转移方程是:

f(0) = nums[0]
f(1) = max(nums[0], nums[1])
f(i) = max(f(i-1), f(i-2) + nums[i])

程序:

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums: return 0
        if len(nums) <= 2: return max(nums)
        return max(self.dfs(nums[1:]), self.dfs(nums[:-1]))        
        
    def dfs(self, nums):        
        dp=[]
        dp.append(nums[0])
        dp.append(max(nums[0], nums[1]))
        for i in range(2, len(nums)):
            dp.append(max(dp[i-1], dp[i-2] + nums[i]))
        return dp[-1]

结果:

python-Leetcode算法题213_第2张图片

python-Leetcode算法题213_第3张图片

2020.7.16——不知道今天做的决定对不对,希望未来的某天不要太难过

 

你可能感兴趣的:(刷题)