代码随想录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.mzph.cn/news/818841.shtml

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

相关文章

pyqt QToolBar 选中高亮

目录 效果图 示例代码 效果图 示例代码 from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QToolBar, QToolButtonclass HighlightingToolButton(QToolButton):def __init__(self, parentNone):super().__init__(parent)self.setCheckable(True)def nextChe…

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

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

尚鼎环境科技诚邀您参观2024第13届生物发酵展

参展企业介绍 尚鼎环境科技(江苏)有限公司设立于2010年,公司坐落于江南平原南端素有『苏北门户』之称的古城扬州,办公室位在江苏省扬州市邗江区高新技术创业服务中心。 尚鼎环境科技长年致力于食品精炼/环境工程领域全程技术服务,工程实绩遍…

OpenHarmony南向开发案例:【智能体重秤】

一、简介 本demo基于OpenHarmony3.1Beta版本开发,该样例能够接入数字管家应用,通过数字管家应用监测体重秤上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式表现…

html公众号页面实现点击按钮跳转到导航

实现效果&#xff1a; 点击导航自动跳转到&#xff1a; html页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>跳转导航</title><meta name"keywords" conten…

华为框式交换机S12700E系列配置CSS集群

搭建集群环境 a.为两台交换机上电&#xff0c;按照数据规划分别对两台框式交换机进行配置 <HUAWEI> system-view [HUAWEI] sysname Switch1 [Switch1] set css id 1 [Switch1] set css priority 150 //框1的集群优先级配置为150 [Switch1] interface css-port 1 [Sw…

java的深入探究JVM之内存结构

前言 Java作为一种平台无关性的语言&#xff0c;其主要依靠于Java虚拟机——JVM&#xff0c;我们写好的代码会被编译成class文件&#xff0c;再由JVM进行加载、解析、执行&#xff0c;而JVM有统一的规范&#xff0c;所以我们不需要像C那样需要程序员自己关注平台&#xff0c;大…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

【RabbitMQ】RabbitMQ基础认识

文章目录 前言初识MQSpringAMQP如何首发消息&#xff1f;消费者交换机Fanout&#xff1a;广播Direct交换机Topic交换机声明队列和交换机 总结 前言 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这…

JavaSE图书管理系统

JavaSE图书管理系统 思路一.Main方法二.User包1.User类2.NormaUser类3.AdminUser类三.book包1.BookList类2.Book类四.operation包1.IOPeration接口2.AddOperation类新增图书3.BorrowOperation类借阅图书4.DelOperation类删除图书5.FindOperation类查找图书6.ReturnOperation类归…

总结|性能优化思路及常用工具及手段

性能优化是降低成本的手段之一&#xff0c;每年大促前业务平台都会组织核心链路上的应用做性能优化&#xff0c;一方面提升系统性能&#xff0c;另外一方面对腐化的代码进行清理。现结合业务平台性能优化的经验&#xff0c;探讨一下性能优化的思路及常用工具及手段。性能优化本…

jenkins(docker)安装及应用

jenkins Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解…

稀碎从零算法笔记Day50-LeetCode:寻找峰值

LC50天成就了 题型&#xff1a;数组、滑动窗口、二分 链接&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索…

STM32移植嵌入式开源按键框架

目录 STM32移植嵌入式开源按键框架 MultiButton简介 multi_button.c文件 multi_button.h文件 按键事件 案例使用方法 学习剖析 STM32移植嵌入式开源按键框架 今天移植了一款嵌入式按键框架工程MultiButton&#xff0c;MultiButton是一个小巧简单易用的事件驱动型按键驱动…

Qt 3 QVariant类的使用和实例

QVariant, 类本质为 C联合(Union)数据类型&#xff0c;它可以保存很多Qt 类型的值&#xff0c;包括 QBrush、QColor、QString 等等。也能够存放Qt的容器类型的值。QVariant::StringList 是 Qt定义的一个 QVariant::type 枚举类型的变量&#xff0c;其他常用的枚举类型变量如下表…

【Qt】:对话框(二)

对话框 一.消息对话框&#xff08;QMessageBox&#xff09;1.自己构建2.使用静态函数构建 二.颜色对话框&#xff08;QDialog&#xff09;三.文件对话框&#xff08;QFileDialog&#xff09;四.字体对话框&#xff08;QFontDialog&#xff09;五.输入对话框&#xff08;QInputD…

沐风老师3DMAX物品摆放插件ObjectPlacer安装和使用方法详解

3DMAX物品摆放插件ObjectPlacer安装和使用教程 3DMAX物品摆放插件ObjectPlacer&#xff0c;一键在曲面上摆放对象&#xff0c;如摆放家具物品、种植花草树木、布设电线杆交通标志等。它的功能是将对象与几何体对象&#xff08;网格、多边形、面片或NURBS&#xff09;的面法线对…

中电金信:夯实云原生时代的系统韧性建设——中电金信混沌工程金融业实践

IT系统建设在经历过单机、集中、分布式的演变历程后&#xff0c;系统运维演练、故障模拟测试的复杂度也不断提高。在复杂的分布式系统中&#xff0c;基础设施、应用平台都可能产生不可预知的故障&#xff0c;在不能确知故障根源的情况下&#xff0c;我们无法阻止故障的发生。更…

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…

Mockito单元测试

文章目录 Mockito单元测试 为什么要使用Mock?导入依赖import导入包使用Mock模拟测试某个类中的某个方法是否可以成功执行使用Mock模拟某个类的方法&#xff0c;自己给这个方法返回我们指定的值使用Mock模拟某个方法调用后会抛出指定的异常使用Mock模拟测试某个类中的某个方法(…