代码随想录Day41:动态规划Part3

news2024/12/26 23:03:57

Leetcode 343. 整数拆分

讲解前:

毫无头绪

讲解后:

这道题的动态思路一开始很不容易想出来,虽然dp数组的定义如果知道是动态规划的话估摸着可以想出来那就是很straight forward

dp定义:一维数组dp[i], i 代表整数的值,dp[i] 代表将整数 i 拆分的话可以获得的最大乘积

然后呢就是定义递归推导式了,我们可以这样去想这道题,既然题目要求我们拆分的话必须要最少有两个数,那么其实可以把获得最大乘积的可能分为两种情况,对于每一个整数 i,我们进行一个遍历,让 j 从 1 遍历到 i - 1,也就是当 i = 5的时候,j遍历1,2,3,4 这样的话相当于我们可以找到拆分成两个数的所有可能,那么第一种情况就是: 最大的乘积是从 j * (i - j) 中获取的,也就是1*4, 2*3, 3* 2, 4*1, 第二种情况就会变成:最大乘积是从3个以上的数字中获得的,意味着我们会对 i - j 遍历到的数字进行拆分,那么如果我们刚好能得到 拆分 j - i 的乘积最大值,那么再和 j 相乘,一定就也是当我们用三个以上数字的最大乘积,那拆分 j 的乘积最大值是多少呢?不就刚好是 dp[i - j] 吗,下面我画了当 i 是3,4,5 的时候我们会计算的所有值

 

你会发现这样的话,对于三个数以上的可能,我们也完全不用担心会错过一些组合,由于动态递归的帮助,我们在计算出一个dp[i] 的值之前,就已经考虑过了所有的可能

这里还要注意一点, 以上的计算,只是在当整数是 i 的时候,我们在比较到底是当我们之后 j * (i - j)两个数相乘的时候有更大乘积,还是当我们有 j * 拆分(j - i) 一共三个数以上的时候有更大的乘积,但是我们并不知道当 j 遍历到哪的时候会得到所有可能中最大的乘积,所以在推导式中还要再加入一个比较就是一直更新保持dp[i] 储存遍历过程中最大的值

那么我们就可以总结出来递归推导公式

dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[2] = 1

        for i in range(3, n + 1):
            for j in range(1, i):
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
                print(dp)
        
        return dp[n]

Leetcode 96. 不同的二叉搜索树

讲解前:

太难了

讲解后:

这道题首先我们可以把从n=1到n=3的所有可能画出来

观察上面的图,仔细去看其中的规律,我们其实可以总结出来两个非常重要的点来帮助我们推导我们的dp推导公式

1. 对于任何n个节点从1到n不相同的平衡二叉树,其实所有的组合是首先我们把1作为root节点,找到有多少种组合,然后再把2作为头节点,然后去找有多少组合,再把3作为头节点,去找有多少种组合.......直到把n作为头节点,看有多少组合,然后全部加起来,就如上图的n=3,答案5=2(1 as root) + 1(2 as root) + 2(3 as root) 个组合 

2. 对于二叉树来说,如果我们能够知道左子树一共有多少种组合,并且直到右子树一共有多少种组合,那么其实这个二叉树一共就有左子树组合数 * 右子树组合数 数量的组合,因为每一个特别的左子树都可以和每一个特别的右子树结合来构造一个新的树,举个例子的话就是上图中的在n=3并且我们的root是1的时候,我们有两种组合,其实这两种组合是这样得来的,我们知道root=1的时候,左子树没有节点的时候有一个可能,就是空,也就是左子树的组合数为1,然后呢右子树的话,由2和3两个节点组成,他们有两种可能,分别是让3在2的右节点,或者2在3的左节点,这样以来我们就知道对于root=1的时候,我们一共有1*2=2种组合

有了上面两个概念,首先我们可以把动态规划数组的含义想出来,还是很简单,直接按照题意来写

dp[i], i是n,也就是当我们的二叉平衡树是由1-n节点组成的,dp[i] 储存的值就是有多少种不同的可能来构建这个二叉平衡树

接下来我们可以去想,那既然我们知道了上面的概念,那么我们首先可以确定,在每一个dp[i] 求值的过程中,我们需要进行一个叠加,这个叠加就是概念1,就是用 j 来从1-n遍历,找到当 j 为root的时候,每个二叉树分别有多少种构造方法,那这个该怎么找呢?我们发现,当我们知道root=j 的时候,其实左右两个节点分别含有多少节点我们是知道的,因为我们知道一共有1-n个节点并且没有重复,那假设我们有1-10个节点,如果root取7,我们就知道那左子树一定有6个节点分别是1-6,然后右子树有3个节点是8,9,10,这是用 j - 1和,i - j 得来的,那这不就方便了吗,通过概念2我们知道,不同二叉树的数量就等于左子树的变化数量 * 右子树的变化数量,我们还知道左子树的节点数量和右子树的节点数量,知道了节点数量,找变化数量,不就是我们dp数组的含义吗,所以这个时候我们就可以先按照上图中的n=3的情况,写一下这个答案5是怎么得来的

dp[3] = dp[0] * dp[2] (root=1) + dp[1] * dp[1] (root=2) + dp[2] * dp[0] (root=3),这样以来我们就可以推导出公式了

j 为root的元素然后从 1 遍历到 i, 然后dp[i] 的值做一个叠加,分别是j不同值的答案总和

dp[i] = dp[i] + dp[j - 1] * dp[i - j]

 dp推导公式搞明白之后代码就不难了,遍历顺序就是正常的从左到右,我们要先知道小的n才能推理出后面的n,然后呢初始化就是没有节点和就一个节点的组合数量都是1, dp[0] = 1, dp[1] = 1

class Solution:
    def numTrees(self, n: int) -> int:
        # initialize the dp array 
        # have it set to length of n + 1 cuz the answer is dp[n]
        dp = [0] * (n + 1)
        # we know only 1 possibility for n = 0 and 1
        dp[0], dp[1] = 1, 1

        # start iteration from when we have 2 nodes
        for i in range(2, n + 1):
            for j in range(1, i + 1):
                dp[i] = dp[i] + dp[j - 1] * dp[i - j]
        
        return dp[n]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯 — — 纯质数

纯质数 题目: 思路: 一个最简单的思路就是枚举出所有的质数,然后再判断这个质数是否是一个纯质数。 枚举出所有的质数: 可以使用常规的暴力求解法,其时间复杂度为( O ( N N ) O(N\sqrt{N}) O(NN ​)&…

(十)C++自制植物大战僵尸游戏设置功能实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 游戏设置 游戏设置功能是一个允许玩家根据个人喜好和设备性能来调整游戏各项参数的重要工具。游戏设置功能是为了让玩家能够根据自己的需求和设备性能来调整游戏,以获得最佳的游戏体验。不同的游戏和平…

相机系列——透视投影:针孔相机模型

作者:木一 引言 上文我们提到,三维相机是对真实世界成像的模拟,为了让三维物体在计算机屏幕上呈现出来的图像符合人眼观察效果,通常采用透视投影方式模拟相机成像,为了简化计算,可以用针孔相机模型来描述…

设计模式——观察者模式17

观察者模式指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。 中介者模式是N对N的双向关系。观察者模式是1对N的单向关系。 设计模式,一定要敲代码…

STC89C52学习笔记(十三)

STC89C52学习笔记(十三) 综述:本文讲述了红外调控的原理和通信以及外部中断相关知识。 一、红外调控 1、定义 红外遥控是利用红光进行通信的设备。 2、特点 ①由红LED将调制后的信号发出,由专门的红外接收头进行解调输出。 …

​​​​网络编程探索系列之——广播原理剖析

hello !大家好呀! 欢迎大家来到我的网络编程系列之广播原理剖析,在这篇文章中, 你将会学习到如何在网络编程中利用广播来与局域网内加入某个特定广播组的主机! 希望这篇文章能对你有所帮助,大家要是觉得我写…

jupyter使用虚拟环境里的依赖配置

进入虚拟环境fourier-features-pytorchconda activate fourier-features-pytorch 安装ipykernel pip install ipykernel -i https://pypi.tuna.tsinghua.edu.cn/simple将核与虚拟环境匹配 python -m ipykernel install --user --namefourier-features-pytorch打开jupyter j…

Kafka 架构深入介绍 及搭建Filebeat+Kafka+ELK

目录 一 架构深入介绍 (一)Kafka 工作流程及文件存储机制 (二)数据可靠性保证 (三)数据一致性问题 (四)故障问题 (五)ack 应答机制 二 实…

【max材质addtive叠加模式特效渲染不出通道的解决办法】

max材质addtive叠加模式特效渲染不出通道的解决办法 2021-12-22 18:15 max的scanline扫描线,vray渲染可以,红移不行(只支持它自己的材质,它自己的材质没有additive模式)。据说mr是可以的。 右侧的球体使用附加不透明度。 附加不透明度通过将…

关于机器学习/深度学习的一些事-答知乎问(六)

如何使用频率域变换对序列数据进行增强? 时频变换是常见的信号分析思路,同样可用于数据增强。在频率域添加噪声是方法之一。比如可以对传感器信号应用短时傅里叶变换STFT得到具有时序关系的谱特征,再在谱特征上应用两种数据增强方法。一是对…

Amazon MemoryDB for Redis的探索和实践

一、背景 由于当下项目的日益增长的数据量,单机Redis已经远远不能满足我们的要求。考虑转成集群,但是直接在服务器中搭建Redis集群的话,EC2挂掉则Redis也会随之挂掉,耦合性太强。所以将Redis相关的服务全部抽取在单独的服务器上或…

论文笔记:Time Travel in LLMs: Tracing Data Contamination in Large Language Models

iclr 2024 spotlight reviewer评分 688 1 intro 论文认为许多下游任务(例如,总结、自然语言推理、文本分类)上观察到的LLMs印象深刻的表现可能因数据污染而被夸大 所谓数据污染,即这些下游任务的测试数据出现在LLMs的预训练数据…

ins视频批量下载,instagram批量爬取视频信息

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

MySQL模糊查询

一、MySQL通配符模糊查询(%,_) 1.1.通配符的分类 1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次) 2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然…

计算机组成原理【CO】Ch3 存储系统

文章目录 考纲3.1 存储系统概述3.2 主存储器3.3 主存储器与CPU的连接3.4 外部存储器3.5 高速缓冲存储器3.6 虚拟存储器【※】存储系统总体流程图【※】各个部件的存储位置计算机存储相关硬件与数据结构说明进程控制块(PCB)页表页表始址页表始址寄存器(PTR)MMU(内存管理单元…

Springboot Gateway 报错Failed to resolve “bogon”的原因及解决办法

一、问题出现原因及初步分析 今天遇到一个奇怪的错误,一个一直正确运行的微服务后台,突然无法访问,如何重启都会报错。 想到近期有人在服务器上安装过其它服务,因此,考虑可能是配置问题,可配置问题修复后…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

信也科技网络自动化实践-网络策略管理

1、背景 随着各种法律法规和行业标准的出台和更新,企业或组织需要遵守各种安全合规性要求。网络安全策略管理需要符合这些要求,从而保障企业或组织的安全和合规性。网络安全策略管理需要涵盖企业或组织的整个网络生命周期,包括网络规划、设计…

halcon 3.2标定相机

参考《solution_guide_iii_c_3d_vision.pdf》 3.2.2.2 Which Distortion Model to Use 选用何种畸变模型 对于面阵相机,halcon中两种畸变模型:The division model and the polynomial model(差分模型和多项式模型),前…

MLOps

参考: 什么是MLOps?与DevOps有何异同?有什么价值?https://baijiahao.baidu.com/s?id1765071998288593530&wfrspider&forpcMLOps简介_AI开发平台ModelArts_WorkflowMLOps(Machine Learning Operation)是机器学习&#xf…