198/213 打家劫舍(动态规划)

https://leetcode-cn.com/problems/house-robber-ii/

 

 

 

思路: 

  1. 题目求数组非连续元素的最大和,状态转移方程为:

    dp[n] = max(dp[n-1],dp[n-2] + num)

  2. 第二题要求 取了第0号num就不能要最后一项num,我就正反算了两边,通过了,时间效率比较低,我现在去看看答案。

 

注意:

   我的版本:用了一个二维数组来记录路径,然后再顺序倒序运行两遍。。。

   答案版本:直接运行    max(my_rob(nums[:-1]),my_rob(nums[1:])) if len(nums) != 1 else nums[0]

 

收获:

   状态转移方程一定要想清楚再动笔啊 - - 

 

 代码:

class Solution:
    def rob(self, nums: List[int]) -> int:
        def robOnce(nums):
            dpFst,dpSec = 0,0
            dp = [[i] for i in range(len(nums))]
            print(dp)
            selection = -1
            if len(nums)<4: return max(nums) if nums else 0
            for i in range(len(nums)-1):
                if dpFst + nums[i] > dpSec:
                    if i > 1:dp[i] += dp[i-2]
                    cur = dpFst + nums[i]
                elif dpFst + nums[i] == dpSec:
                    if i>1 and 0 not in dp[i-2]:dp[i] += dp[i-2]
                    elif i>0 and 0 not in dp[i-1]:dp[i] = dp[i-1]
                    elif i > 0: dp[i] = dp[i-1]
                    cur = dpFst + nums[i]
                else:
                    if i>0 :dp[i] = dp[i-1]
                    cur = dpSec
                print(dp)
                dpFst,dpSec = dpSec,cur
                print(dpFst,dpSec)
            #如果选了0号元素,则不考虑最后一个
            print(dp)
            if 0 in dp[-3]:
                print('first')
                print(dpFst,dpSec)
                return max(dpFst,dpSec)
                
            else:
                print('sec')
                print (dpFst,nums[-1],dpSec)
                return max(dpFst+nums[-1],dpSec)
        a = robOnce(nums)
        b = robOnce(nums[::-1])
        return max(a,b)
posted @ 2020-02-01 20:33  ChevisZhang  阅读(136)  评论(0编辑  收藏  举报