代码随想录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的遍历

总结

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Axure RP制作web页面并实现无公网ip远程访问——“cpolar内网穿透”

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)

智慧校园管理小程序目录 目录 基于微信小程序的智慧校园管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;学生信息管理 &#xff08;2&#xff09; 作业信息管理 &#xff08;3&#xff09;公告…

DM数据库学习之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC准备工作 在所有安装DPC服务器上部署dmagent&#xff0c;dmagent的运行环境需要依赖JAVA环境&#xff0c;JAVA版本必须为JAVA1.8。 创建用户 所有安装DPC服务器&#xff0c;手工建dmdba用户 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…

Java数据结构----时间和空间复杂度

目录 1.算法效率 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 推导大O阶方法 3.4 常见时间复杂度计算举例 3.空间复杂度 1.算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xf…

手机通用便签APP哪个比较好用?

手机通用便签APP哪个比较好用&#xff1f;随着现代科技的不断发展&#xff0c;手机的更新换代频率是比较快的&#xff0c;基本两三年就会换新手机。其中Android和iOS系统为手机主要使用系统&#xff0c;有些用户在使用一个系统腻了后&#xff0c;通常想更换另一个系统的品牌手机…

哪些行业适合做小程序?零售电商、餐饮娱乐、旅游酒店、教育生活、医疗保健、金融社交、体育健身、房产汽车、企管等,你的行业在其中么?

引言 在当今数字化时代&#xff0c;小程序成为了各行各业快速发展的数字工具之一。它的轻便、灵活的特性使得小程序在多个行业中找到了广泛的应用。本文将探讨哪些行业适合开发小程序&#xff0c;并介绍各行业中小程序的具体应用。 一、零售和电商 在当今数字化的商业环境中&…

select a,b,c from 表 where b=1 and c=1; abc是联合索引,这样查询会命中索引吗?

如果select 只显示索引列 那么会命中索引 如果select * 那么不会走索引&#xff0c;会查全表

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

互联网加竞赛 大数据房价预测分析与可视

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据房价预测分析与可视 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适合…

国产替代MATLAB的征途

国产替代MATLAB的征途 The Journey of Domestic Alternatives to MATLAB 在科技的浪潮中&#xff0c;软件成为了推动进步的重要工具。MATLAB&#xff0c;这一工程和科学计算的巨擘&#xff0c;因其强大的数值分析、矩阵运算能力和丰富的应用工具箱&#xff0c;在全球学术界和工…

【c语言】字符函数和字符串函数(上)

前言 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 1. 字符分…

nginx 第三方模块 与变量

一&#xff0c; 网页的状态页 详细见上一章 《nginx 配置文件详细介绍》 二&#xff0c;Nginx 第三方模块 开源 不是官方模块 别人写的 你编译进nginx&#xff08;./configure 这一步添加的模块&#xff09; &#xff08;一&#xff09;ehco 模块 这边以echo 模块为…

MySQL-行转列,链接查询

1. 行转列 1.1 示例数据准备 create table test_9(id int,name varchar(22),course varchar(22),score decimal(18,2) ); insert into test_9 (id,name,course,score)values(1,小王,java,99); insert into test_9 (id,name,course,score)values(2,小张,java,89.2); inse…

RocketMQ - 消息中间件路由中心的架构原理

1. NameServer到底可以部署几台机器 要部署RocketMQ&#xff0c;就得先部署NameServer&#xff0c;那么NameServer到底可以部署几台机器呢&#xff1f;是一台机器还是可以部署多台机器&#xff0c;如果部署多台机器&#xff0c;他们之间是怎么协同工作的&#xff1f; NameSer…

备战蓝桥杯————递归反转单链表

当要求只反转单链表中的一部分时&#xff0c;递归实现确实具有一定的挑战性&#xff0c;但也是可行的。下面我将介绍一种递归实现的方法来反转单链表中的一部分。 一、反转链表 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示…

Mac 下 Python+Selenium 自动上传西瓜视频

背景 研究下 PythonSelenium 自动化测试框架&#xff0c;简单实现 Mac 下自动化批量上传视频西瓜视频并发布&#xff0c;分享给需要的同学&#xff08;未做过多的异常处理&#xff09;。 脚本实现 首先通过手工手机号登录&#xff0c;保存西瓜视频网站的 cookie 文件 之后加载…

基于java在线调查表单系统

基于java在线调查表单系统 一、演示效果二、特性汇总三、下载链接 一、演示效果 二、特性汇总 多种技术方案&#xff0c;满足不同的技术选型需求完善的浏览器兼容、保证传统客户也能正常使用部署简单&#xff0c;一行命令完成部署更新方便&#xff0c;直接替换原安装文件不用担…

通过二叉树例题深入理解递归问题

目录 引入&#xff1a; 例1&#xff1a;二叉树的前序遍历&#xff1a; 例2&#xff1a; N叉树的前序遍历&#xff1a; 例3&#xff1a;二叉树的最大深度&#xff1a; 例4&#xff1a;二叉树的最小深度 例5&#xff1a;N叉树的最大深度&#xff1a; 例6&#xff1a;左叶子…

基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游网管理系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ui设计:利用即使设计设计出漂亮样式

目录 一、基本操作 二、具体介绍 6-1 填充图片 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出​编辑 一、基本操作 二、具体介绍 6-1 填充图片 选择其一图片填充 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出