代码随想录day34--动态规划的应用2 | LeetCode343.整数拆分、LeetCode96.不同的二叉搜索树

LeetCode343.整数拆分

题目描述:

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

解题思路:

1.确定dp数组以及其下标的含义

dp[i]:拆分数字i,可以得到的最大乘积为dp[i]

2.确定递推公式

需要明确的是dp[i]的最大乘积是如何得到的,从1开始遍历,有两个方法可以得到dp[i]

一个是j*(i-j),也就是将数拆成两个数

一个是j*dp[i-1],也就是将数拆成两个以上的数,如果不能理解,可以看看我们队dp[i]的定义

所以递推公式就得到了dp[i] = max(dp[i],max((i-j)*j,dp[i-j]*j))

3.dp数组如何初始化

依旧从定义出发,我们就可以知道,dp[i]初始化最小要从2开始,因为按照我们的定义,如果i等于0或者1,那么就没有任何意义(因为dp[i]是可以拆分的数的乘积)

那么我就将dp[2]赋值为1

4.确定遍历顺序

根据递推公式,我们可以知道,dp[i]的结果需要知道dp[i-j],所以我们的结果是需要从前向后推导的

5.举例推导dp数组

因为这道题的计算量比较大,所以,我们只能以示例为例子,观察是否可以得到正确的答案

以上分析完毕,代码如下:

class Solution {
public:int integerBreak(int n) {vector<int> dp(n+1);dp[2] = 1;for(int i = 3;i <= n;i++){for(int j = 1;j <= i/2;j++){dp[i] = max(dp[i],max((i-j)*j,dp[i-j]*j));}}return dp[n];}
};

·时间复杂度:O(n^2)

·空间复杂度:O(n)

难点:

·递推公式的推导

·dp[i]初始值的确定

总结

这道题的递推公式并不好想,而且初始化的时候,也有很多细节的地方,而且一切都需要围绕着dp[i]的定义推导,否则就会出现自相矛盾的地方

LeetCode96.不同的二叉搜索树

题目描述:

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

解题思路:

1.确定dp数组以及其下标的含义

dp[i]:1到i为节点组成的二叉搜索树的个数为dp[i]

也可以理解为i个不同元素节点组成的二叉搜索树的个数为dp[i]

2.确定递推公式

这题的递推公式比较复杂,需要从例题中一点一点分析出来

当n为1的时候,只有一颗搜索树

当n为2的时候,有两颗搜索树

当n为3的时候,其左子树有两个节点并且这两个节点的布局,与n为2时的情况一致

当n为1的时候,其右子树的两个节点也与n为2时的情况一致

当n为2时,其左右子树都只有一个节点,可以看作是与n为1时的情况一致

分析到此,我们就找到了重叠子问题,并且可以发现,dp[3]是由dp[1]和dp[2]推导而来

dp[3]= 以元素1为根节点搜索树的数量+以元素2为根节点搜索树的数量+以元素3为根节点搜索树的数量

以元素1为根节点搜索树的数量 = 右子树2个元素的搜索树数量*左子树有0个元素的搜索树的数量

以元素2为根节点搜索树的数量 = 右子树1个元素的搜索树数量*左子树有1个元素的搜索树数量

以元素3为根节点搜索树的数量 = 右子树0个元素的搜索树数量*左子树有2个元素的搜索树数量

所以dp[3] = dp[2]*dp[0] + dp[1]*dp[1] + dp[0]*dp[2]

所以从以上分析可知,dp[i] += dp[以j为根结点左子树节点数量]*dp[以j为根结点右子树节点数量]

j相当于是根节点的元素,遍历从1到i为止

所以递推公式为 dp[i] += dp[j-1]*dp[i-j];j-1为根结点左子树数量,i-j为以j为根节点右子树数量

3.dp数组如何初始化

只需要初始化dp[0]即可,因为空结点也算是一棵二叉树,并且属于n为1的左右子树,可以推导出dp[1],但是千万不能赋值为0,否则无法得到数值

4.确定遍历顺序

从递推公式就可以看出,节点数为i的状态是依靠之前节点数的状态

那么遍历中i需要从头遍历,再使用j遍历到i,剩下的则作为其右子树

5.举例推导dp数组

递推到3或者4就足够了,n为5的时候数量已经很大了

综上分析,代码如下:

class Solution {
public:int numTrees(int n) {vector<int> dp(n+1);dp[0] = 1;for(int i = 1;i <= n;i++){for(int j = 1;j <= i;j++){dp[i] += dp[j-1]*dp[i-j];}}return dp[n];}
};

·时间复杂度:O(n^2)

·空间复杂度:O(n)

难点:

·递推公式的确定

·初始值的赋予

·遍历顺序,尤其是j的遍历

总结

这道题使用动态规划是比较复杂的,因为需要举例,分析,才能找到递推关系

然后就是递推公式,如果把递推公式想明白了,那么遍历顺序和初始化,就是顺其自然的可以得出

所以按照递归五部曲可以准确的解决动态规划的题目,大家可能已经初步感受到了五部曲带来的好处

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

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

相关文章

深入理解计算机系统学习笔记

2.3整数运算 有时候会发现两个正数相加会得出一个负数&#xff0c;而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。 2 .3. 1 无符号加法 原理&#xff1a; 在正…

什么是媒体发稿?发稿媒体分类及发稿流程

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体发稿是一种企业推广和宣传的手段&#xff0c;通过媒体渠道传递企业信息和形象。 媒体发稿的含义在于&#xff0c;当企业有新闻、事件或其他消息需要对外公布时&#xff0c;可以选择…

改进RAG:自查询检索

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Improving RAG: Self Querying Retrieval 原文地址:https://medium.com/@ogre51/improving-ra…

Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用 1、Promise 介绍与基本使用Promise是什么&#xff1f;理解&#xff1a;为什么要用 PromisePromise 的初体验 - 抽奖Promise 初体验 - 文件读取&#xff08;返回 Promise 对象&#xff09; 2、Promise 的状态3、Promise 对象的值3、Promise 关键问题4、P…

基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计

采集卡硬件设计 3.1 引言 采集卡的硬件设计是实现采集功能的基础&#xff0c;良好的硬件设计可以使采集功能更容 易实现&#xff0c;方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡…

提升Vue3应用效率的秘诀:深入比较ref与reactive!

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

关于纯前端想要变成全栈编写接口的学习推荐

推荐学习uniappuniclouduniadmin 学习成本低,不到一个月就能开发出自己的接口,上传到服务空间,并且能够实现后端的功能,能够调用接口 当然这里使用的不是mysql数据库,而是unicloud推荐的存储方式 操作起来也很方便

文件上传---->生僻字解析漏洞

现在的现实生活中&#xff0c;存在文件上传的点&#xff0c;基本上都是白名单判断&#xff08;很少黑名单了&#xff09; 对于白名单&#xff0c;我们有截断&#xff0c;图片马&#xff0c;二次渲染&#xff0c;服务器解析漏洞这些&#xff0c;于是今天我就来补充一种在upload…

技术揭秘:如何构建量子纠错时代的实施路线图?

&#xff08;原文作者&#xff1a;Q-CTRL 首席执行官兼创始人 Michael J Biercuk 教授&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;4500字丨20分钟阅读 当前&#xff0c;人们对量子纠错 (Quantum Error Correction,QEC) 时代的到来兴致盎然。由于QEC是量…

基于ELFBoard开发板的车牌识别系统

本项目采用的是ElfBoard ELF1开发板作为项目的核心板&#xff0c;主要实现的功能为通过USB 摄像头对车牌进行识别&#xff0c;如果识别成功则会亮绿灯&#xff0c;并将识别的车牌号上传到手机APP上面&#xff0c;车牌识别的实现是通过百度OCR进行实现&#xff0c;手机APP是用Ja…

CSS文本超出显示3个点的方法

在CSS中&#xff0c;如果你想让超出特定长度的文本显示为三个点&#xff08;...&#xff09;&#xff0c;你可以使用text-overflow属性&#xff0c;配合overflow和white-space属性。以下是一个简单的示例&#xff1a; .text-ellipsis { white-space: nowrap; /* 确保文本不会…

从基础到高级:Go中crypto/x509库的终极指南

从基础到高级&#xff1a;Go中crypto/x509库的终极指南 引言x509基础介绍X.509证书的基础知识X.509在加密通信中的作用X.509证书的应用场景 crypto/x509库的核心功能解析X.509证书代码示例&#xff1a;解析证书 创建X.509证书代码示例&#xff1a;创建证书 处理SSL/TLS证书代码…