首页 > 其他分享 >第九章 动态规划Part7

第九章 动态规划Part7

时间:2024-08-24 13:26:06浏览次数:7  
标签:max return nums 第九章 lo self Part7 动态 dp

任务

198.打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

思路

dp[i] 表示[0,i]的房屋所能偷窃到的最大金额,根据规则,dp[i] = max(dp[i-2]+nums[i],dp[i-1])),即选择当前房间或者不选当前房间的最大值作为dp[i]。

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) < 2: return nums[0]
        dp = [0] * len(nums)
        dp[0] = nums[0]
        dp[1] = max(nums[0],nums[1])

        for i in range(2,len(nums)):
            dp[i] = max(dp[i-2] + nums[i],dp[i-1])
        return dp[len(nums)-1]

213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

思路

考虑去掉末尾和去掉开头两种情况,取其中的较大者作为最大金额,其中包含了去掉开头和结尾的情况。

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1 : return nums[0]
        notConsiderLast = self.robA(0,len(nums)-1,nums)
        notConsiderFirst = self.robA(1,len(nums),nums)
        return max(notConsiderFirst,notConsiderLast)

    def robA(self,lo,hi,nums):
        if hi-lo == 1: return nums[lo]
        dp = [0] * len(nums)
        dp[lo] = nums[lo]
        dp[lo+1] = max(nums[lo],nums[lo+1])

        for i in range(lo+2,hi):
            dp[i] = max(dp[i-2] + nums[i],dp[i-1])
        
        return dp[hi-1]

337.打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

思路

考虑树形DP,每个节点向上返回的是选当前节点和不选当前节点的最大值列表。(这个比较难想到),但是想到后整体思路还是比较简单
选当前节点的获得的最大值等于 自己加上不选左右节点
不选当前节点的最大值等于 左右节点(选或不选)的最大值相加

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rob(self, root: Optional[TreeNode]) -> int:
        return max(self.robTree(root))
    def robTree(self,node):
        if not node: return [0,0]
        
        left = self.robTree(node.left) #左边收集和不收集分别最大的元素
        right = self.robTree(node.right) #右边收集和不收集分别最大的元素
        #选当前node
        val1 = node.val + left[1] + right[1]
        #不选当前node
        val2 = max(left[0],left[1]) +  max(right[0],right[1])

        return [val1,val2]

标签:max,return,nums,第九章,lo,self,Part7,动态,dp
From: https://www.cnblogs.com/haohaoscnblogs/p/18377674

相关文章

  • 如何在 Nuxt 中动态设置页面布局
    title:如何在Nuxt中动态设置页面布局date:2024/8/24updated:2024/8/24author:cmdragonexcerpt:摘要:本文介绍如何在Nuxt框架中通过设置setPageLayout函数动态调整页面布局,包括安装Nuxt、创建不同布局文件及中间件,并通过示例演示如何根据不同路径设置相应布局。categ......
  • 动态规划
    拿出来写,我的dp真的要菜死了。动态规划也是大坑,待填。斜率优化推式子大题,推出柿子之后可以通过对柿子变换得到类似一次函数柿子,然后就可以扔到二维平面看做凸包,用二分/cdq/单调队列/数据结构等等东西维护,也可以用李超树偷懒硬搞,好像复杂度要多只老哥。P4655[CEOI2017]Bui......
  • C动态内存分配和管理函数malloc,calloc,free与realloc
    目录 介绍1.void*malloc(size_tsize);2.void*calloc(size_tnum,size_tsize);3.void*realloc(void*ptr,size_tsize);4.voidfree(void*ptr);5.代码演示 介绍在C语言中,malloc、calloc、realloc 和 free 是用于动态内存分配和管理的标准库函数。它们......
  • ArrayList动态扩容机制(长度可变原理)
    ArrayList底层是数组结构的,数组的默认长度为10。当数组添加满了后,会自动扩容为1.5倍。原理讲解:1.用空参构造函数创建ArrayList集合容器。测试代码:publicclassArrayListDemo{publicstaticvoidmain(String[]args){//创建ArrayList集合容器......
  • dll动态链接库怎么修复?动态链接库修复指南
    DLL(DynamicLinkLibrary)动态链接库是Windows操作系统中至关重要的一部分,它包含了可由多个程序共享的功能代码。当DLL文件出现问题时,如缺失、损坏或版本不兼容,可能导致应用程序无法正常运行,甚至系统错误。本文将详细介绍修复DLL动态链接库的几种常见方法,帮助用户解决此类问题。......
  • C++的动态数组vector番外之capacity
    今日诗词:爱他明月好,憔悴也相关。西风多少恨,吹不散眉弯。                    ——《临江仙·寒柳》【清】纳兰容若目录引言正文string中的和vector中的capacity有什么区别 vector扩容时内存分配的策略是什么?capacity在vect......
  • 24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,33
    目录198.打家劫舍题目描述题解213.打家劫舍II题目描述题解337.打家劫舍III题目描述题解打家劫舍的一天......
  • Java设计模式之代理模式:静态代理VS动态代理,与其他模式的对比分析和案例解析
    一、代理模式简介代理模式(ProxyPattern)是一种结构型设计模式,它提供了一个代理对象,用来控制对另一个对象的访问。这种模式通常用于在访问对象时引入额外的功能,而不改变对象的接口。代理模式的核心思想是为其他对象提供一种代理,以控制对这个对象的访问。在现实生活中,代理模......
  • 动态类加载
    动态类加载代码块加载顺序这里的代码块主要指的是这四种静态代码块:static{}构造代码块:{}无参构造器:ClassName()有参构造器:ClassName(Stringname)我创建两个类Person.javapublicclassPerson{publicstaticintstaticVar;publicstaticintid;static{Syst......
  • 动态规划引入 Day 1
    动态规划总所周知,动态规划是一个肥肠重要的一个东西(对于算法竞赛而言)……So,我们开始讲动态规划。用的是Luogu官方题单:https://www.luogu.com.cn/training/211#problems以下也会依此顺序来讲解。。。引子Problem1https://www.luogu.com.cn/problem/P1216[USACO1.5][I......