zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    理解vertical-align
    理解css行高(line-height)
    react 生命周期函数
    react Diff 算法
    React中的虚拟DOM
    无限重启:windows更新之后,在输入密码页面无限重启进入不了系统
    [转]github 上传project代码
    【转】HTTP响应状态码参考簿
    TweenMax—ScrambleText插件 实现类似电脑破译密码的特效
    既然CPU一次只能执行一个线程,那多线程存在的意义是什么?
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12250035.html
Copyright © 2011-2022 走看看