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

news2025/1/11 14:49:47

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.coloradmin.cn/o/1471540.html

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

相关文章

mysql数据同步组件

# 要求&#xff1a; 支持实时同步&#xff0c; 支持增量同步&#xff0c; 不用写业务逻辑&#xff0c; 支持Mysql之间同步&#xff0c; 活跃度高。 # 可选组件&#xff1a;canal ,debezium, datax , Databus, Flinkx , Bifrost &#xff1a; Bifrost 特点&#xff1a; 1. …

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose&#xff0c;本篇文章介绍下线稿约束&#xff0c;关于线稿约束有好几个处理器都属于此类型&#xff0c;但是有一些区别。 包含&#xff1a; 1、Canny(硬边缘&#xff09;&#xff1a;识别线条比较多比较细&#xff0c;一般用于更大程度得还原照片 2、ML…

2024年西安市省级工业互联网平台申报条件材料、时间流程

一、申报条件 (一)申报单位须在西安市内登记注册,具有独立的法人资格和规范的财务管理制度,无不良信用记录,照章依法纳税。 (二)面向陕西省支持的35个工业重点产业方向内的中小企业提供服务,围绕各类型工业场景,加快企业内部信息化系统综合集成和云化改造,连接设备、软件、工…

【FPGA】线性反馈移位寄存器(LFSR)的Verilog实现

什么是移位寄存器 移位寄存器&#xff1a;是指多个寄存器并排相连&#xff0c;前一个寄存器的输出作为下一个寄存器的输入&#xff0c;寄存器中存放的数据在每个时钟周期向左或向右移动一位。 下面的右移移位寄存器因为左侧没有有效输入&#xff0c;所以在第4个时钟周期&…

转本考前如何调整心态

不少同学还在过年的氛围中还没走出来。 担忧自己成绩不进反退&#xff0c;又不知道该如何调整心态&#xff01;这个时候小编就有几点小建议给到各位考生。 *心态*情绪 良好的考试心态是没有固定的心态&#xff0c;对不同学习情况的学生来说&#xff0c;良好的考试心态是不一…

微信小程序--怎样在小程序中创建地图并渲染数据中的点标记

效果&#xff1a; 首先--创建地图 使用官方文档中的地图组件 map <map id"mapId" class"map" longitude"{{longitude}}" latitude"{{latitude}}" markers"{{markers}}"></map> 其中的属性值&#xff1a; lon…

爬虫入门四(抽屉半自动点赞、xpath使用、动作链、打码平台、scrapy框架介绍与安装及创建项目)

文章目录 一、抽屉半自动点赞二、xpath的使用三、动作链四、打码平台介绍超级鹰打码基本测试 五、自动登录超级鹰六、scrapy框架介绍安装创建爬虫项目 一、抽屉半自动点赞 登录抽屉账号保存cookiesimport timeimport jsonfrom selenium import webdriverfrom selenium.webdrive…

使用向量数据库pinecone构建应用04:混合搜索 Hybrid Search

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

啤酒:精酿啤酒与烧烤的热烈碰撞

在夏日的傍晚&#xff0c;烧烤与啤酒总是绝配。当Fendi Club啤酒遇上烧烤&#xff0c;它们将为我们带来一场热烈的美味碰撞。 Fendi Club啤酒&#xff0c;以其醇厚的口感和淡淡的麦芽香气而著称。这款啤酒在酿造过程中采用了特别的工艺&#xff0c;使得酒体呈现出诱人的金黄色&…

【JVM】线上一次fullGC排查思路

fullGC问题背景 监控告警发现&#xff0c;今天开始我们线上应用频繁出现fullGC&#xff0c;并且每次出现后磁盘都会被占满 查看监控 查看监控发现FULLGC的机器均为同一个机房的集器&#xff0c;并且该机房有线上error报错&#xff0c;数据库监控对应的时间点也有异常&#x…

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

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

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

上海亚商投顾:沪指8连阳重新站上3000点 全市场逾百股涨停

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指2月23日继续反弹&#xff0c;成功收复3000点大关&#xff0c;录得8连阳走势。AI概念持续活跃&#xff0c…

springboot219基于SpringBoot的网络海鲜市场系统的设计与实现

网络海鲜市场系统的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)

前面的文章中我们讲述了日志系统项目的前置知识点&#xff0c;再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统&#xff0c;主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置&#xff0c;且支持同步与异…

20240223-2092.查找所有有秘密的人

题目要求 给你一个整数 n&#xff0c;表示有 n 个人&#xff0c;编号从 0 到 n - 1。你还给你一个 0 索引的二维整数数组 meetings&#xff0c;其中 meetings[i] [xi, yi, timei] 表示 xi 和 yi 在 timei 有一个会议。一个人可以同时参加多个会议。最后&#xff0c;给你一个整…

【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法

方法步骤简要 查看你的Flutter项目需要什么版本的 Gradle 插件&#xff1a; 下载这个插件&#xff1a; 方法一&#xff1a;浏览器输入&#xff1a;https://services.gradle.org/distributions/gradle-7.6.3-all.zip 方法二&#xff1a;去Gradle官网找对应的版本&#xff1a;h…

个人机器人课程中最棘手的问题

爱好 22年&#xff0c;观点。当然现在自动驾驶研究路径已经不是22年的模式了。 23年&#xff0c;观点&#xff1a; 一个热爱自动驾驶但妥妥外行之人的思考-2023-CSDN博客 前篇 不合格机器人工程讲师为何不分享成功的案例-CSDN博客 在这篇文章中&#xff0c;有一段&#x…

Maya笔记 设置工作目录

Maya会把素材场景等自动保存在工作目录里&#xff0c;我们可以自己定义工作目录 步骤1 创建workspace.mel文件 文件/设置项目 ——>选择一个文件夹&#xff0c;点击设置——>创建默认工作区 这一个后&#xff0c;可以在文件夹里看到.mel文件 步骤2 自动创建文件夹…

进程的学习

进程基本概念: 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xf…