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

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] = 1for 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 1dp[0], dp[1] = 1, 1# start iteration from when we have 2 nodesfor 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.rhkb.cn/news/310783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB前端-笔记

目录 一、字体 二、背景图片 三、显示方式 四、类型转换 五、相对定位 六、绝对定位 七、固定定位 八、Index 九、粘性定位 十、内边距 十一、外边距 十二、边框 十三、盒子尺寸计算问题 十四、清楚默认样式 十五、内容溢出 十六、外边距的尺寸与坍塌 十七、行…

构建高效可靠的Zabbix监控系统

前言 监控系统对于确保系统稳定性、性能优化以及故障排除至关重要。zabbix 作为一款功能强大且灵活的监控解决方案,可以通过一个友好的界面进行浏览整个网站所有服务器状态、在 web 前端方便查看数据以及可以回溯事故时的问题和告警。 目录 一、zabbix 监控介绍 …

electron打包编译国产统信uos系统 arm架构 x86架构 linux mac等环境

electron v21版本以上统信UOS会提示gbm_bo_map错误,可使用v8~v21版本的electron 打包linux包需要再linux系统下运行编译,arch可以指定架构 如果要在统信uos上运行,需要打包成deb格式,在target中修改成deb 或者用第三方软件把app…

建立时间/保持时间为负是什么情况

目录 建立时间为负保持时间为负参考 在说明建立时间和保持时间为何为负的情况下,首先可以看看建立时间Tsu和保持时间Th的由来,可参考如下两篇文章: 建立时间和保持时间理解_为什么要满足建立时间和保持时间-CSDN博客 ic基础|时序篇&#xff…

基于Springboot的旅游管理系统

基于SpringbootVue的旅游管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页展示 旅游方案展示 旅游资讯 后台管理员登录 后台管理页面首页 用户管理 …

全流程HEC-RAS 1D/2D水动力与水环境模拟技术应用

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而,一方面水动力和水环境模型的使用非常复杂,理论繁复;另一方面,免费的水动力和水环境软件往往缺少重要功能&a…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL,把SQL写死不是比较方便吗?其实有很多的举例,这里我那一个常见的来说,像我们用户注册,会有必填字段和非必填字段,有些传来的参数不一样,那对应的SQL也不一样,因此&…

c++ 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解: 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

前端三剑客 —— JavaScript (第七节)

目录 内容回顾 DOM编程 事件对象* 事件驱动机制 标签绑定 DOM0事件模型 DOM2事件 捕获/冒泡 事件解除 窗口事件属性(Window Event Attributes) 表单事件(Form Events) 键盘事件(Keyboard Events&#xff09…

springboot整合vosk实现简单的语音识别功能

vosk开源语音识别 Vosk是开源的语音识别工具包。Vosk支持的事情包括: 支持十九种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越…

TCP/IP协议—TCP

TCP/IP协议—TCP TCP协议TCP通信特点TCP技术概念TCP定时器 TCP头部报文TCP连接三次握手(建立连接)四次挥手(释放连接)连接状态 TCP协议 传输控制协议(TCP,Transmission Control Protocol)是一种…

ubuntu16.04安装Eclipse C/C++

1.安装 JDK 官网源码安装 首先打开JDK官网,JDK1.8的下载网址为:https://www.oracle.com/cn/java/technologies/downloads/#java8-windows,进入到网址如下图所示: 向下滑动到 JDK1.8的下载界面,如下图所示&#xff1a…

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

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

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能:**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址:**GitHub - PanJiaChen/vue-element-admin: :t…

Linux学习之路 -- 进程篇 -- PCB介绍 -- 进程的孤儿和僵尸状态

前面介绍了进程的各种状态,下面介绍比较特殊的两种状态 -- 孤儿和僵尸(僵死)。 一、僵尸状态 我们创建进程的目的其实就是想要进程帮我们执行一些任务,当任务被执行完后,进程的使命其实就已经完成了。此时我们就需要…

【机器学习300问】69、为什么深层神经网络比浅层要好用?

要回答这个问题,首先得知道神经网络都在计算些什么东西?之前我在迁移学习的文章中稍有提到,跳转链接在下面: 为什么其他任务预训练的模型参数,可以在我这个任务上起作用?http://t.csdnimg.cn/FVAV8 …

MySQL8.0.20 下载与安装

一、下载 MySQL服务器下载安装: 官网社区版地址: https://downloads.mysql.com/archives/installer/ 二、安装 安装注意事项---成功秘诀 安装密码不要设置复杂了,千万要记住密码,比如root和mysql就很好;不要随意卸…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半,AI大模型标志性的应用相继出现,从ChatGPT到Sora一次次刷新人们的认知。震撼的背后,是大模型参数指数级的增长。 这种数据暴涨的压力,快速传导到了大模…

node.js服务器静态资源处理

前言:node.js服务器动态资源处理见 http://t.csdnimg.cn/9D8WN 一、什么是node.js服务器静态资源? 静态资源服务器指的是不会被服务器的动态运行所改变或者生成的文件. 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…