LeetCode题解 动态规划(三):343 整数拆分;96 不同的二叉搜索树

news2025/10/20 15:29:53

343 整数拆分 medium

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

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

这道题乍一看没有点儿动态规划的影子,反而感觉用数学法可以求解。

但是,既然放在了动态规划的范畴里,还是有其可取巧的成分,因为一个数字要拆分,像是后面要提到的背包问题,所以想想应该怎么求解。

还是五部曲,

1 - 确定dp数组:如果是卡的话,大多就卡在这一步和下一步,如果看成背包问题就好想那么一点,那么dp[i] 就可以表示 i 拆分完之后的最大乘积。

2 - 确定递推公式:这道题既不是此前的一维数组,也不是二维数组。我们可以想一下,如果要得到 i 的最大乘积,那么结果必然是从某个乘式而来,先考虑两个数相乘,可以从1到 j 遍历,乘积为 j x (i - j),再考虑多个数相乘,可以用j x dp(i - j)表示

我们以n = 4为例,dp[1] = 1, dp[2] = 1x2 = 2, dp[3] = 1 x 2 = 2

而dp[4] = 2 x 2 = 4, 先从max(1x3, 1xdp[3])考虑,再计算2x2,最终结果还是2x2比较大。

3 - 确定初始化:上一步中就确定了初始化的结果

4 - 遍历顺序:第二步中也分析了

5 - 举例:参考第二步

根据以上思想,代码如下:

int integerBreak(int n) {
    vector<int> dp(n + 1, 0);
    dp[2] = 1;

    for (int i = 3; i <= n; ++i) {
        for (int j = 1; j <= i/2; ++j) {
            dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
        }
    }
    return dp[n];
}

数学法,此处不证明,具体证明过程可以参考本题LeetCode的官方解法,代码如下:

int integerBreak(int n) {
    if (n <= 3) {
        return n - 1;
    }
    int quotient = n / 3;
    int remainder = n % 3;
    if (remainder == 0) {
        return (int)pow(3, quotient);
    } else if (remainder == 1) {
        return (int)pow(3, quotient - 1) * 4;
    } else {
        return (int)pow(3, quotient) * 2;
    }
}

96 不同的二叉搜索树 medium

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

这道题乍一看还是没什么动态规划的感觉,用暴力搜索感觉反而好做一点。

不过还是试着写一写五部曲:

1 - 确定dp数组:dp[i]就是从1到 i ,不相同的二叉搜索树的个数,注意是二叉搜索树,否则这道题就简单了。

2 - 确定递推公式:这一步比较难想。但是应该还是有规律可寻的。此处借用一下随想录中的两张图片来说明问题,

96.不同的二叉搜索树

96.不同的二叉搜索树1

可以看出,当 i = 3的时候,以1为头结点,抛开这个头结点,其结构和 i = 2的时候是一样的;而头结点为2时,左右子树都是一个结点,结构和 i = 1的时候是一样的;而头结点为3的时候,抛开这个头结点,结构和 i = 2是又是一样的。说到这里好像有些规律可寻。但是这道题目怪的地方就在于,我们如果按照下式来写,会发现最后一项没法写。

dp[3] = dp[1] * dp[2] + dp[2] * dp[1] + ?

所以,这道题要这么写,要给 i = 0的时候赋初值,才可以写出来递推公式

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

可以推导出来,dp[i] += dp[j - 1] * dp[i - j]

3 - 初始化:按照第二步中提到的,要初始化dp[0] = 1

4 - 遍历顺序:二维,从小到大

5 - 举例:省略

根据上述思想,代码如下:

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];
}

这道题也有数学方法,成为卡塔兰数,推导公式如下:

image-20230209211244568

根绝这个式子,代码如下:

int numTrees(int n) {
    long long C = 1;
    for (int i = 0; i < n; ++i) {
        C = C * 2 * (2 * i + 1) / (i + 2);
    }
    return (int)C;
}

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

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

相关文章

后勤管理系统—服务台管理功能

数图互通是一家IT类技术型软件科技公司&#xff0c;专业的不动产、工作场所、空间、固定资产、设备家具、设施运维及可持续性管理解决方案软件供应商。 一、后勤管理系统服务台管理功能包含&#xff1a; 1、专业自动化、集中管理的自助服务助理&#xff0c;随时响应服务请求。…

作为公司,这个5款在线软件工具赶紧安利起来!

2023年了 &#xff0c;您的企业还没使用在线软件工具吗&#xff1f;自从用了在线工具之后&#xff0c;感觉打开了新办公世界的大门&#xff0c;效率蹭蹭蹭地往上涨啊。对于喜欢追求效率和便捷的我来说&#xff0c;在线实在是太棒了&#xff01;今天安利几个非常不错的在线软件工…

基于matlab使用神经网络清除海杂波

一、前言此示例演示如何使用深度学习工具箱™训练和评估卷积神经网络&#xff0c;以消除海上雷达 PPI 图像中的杂波返回。深度学习工具箱提供了一个框架&#xff0c;用于设计和实现具有算法、预训练模型和应用程序的深度神经网络。二、数据集该数据集包含 84 对合成雷达图像。每…

智能工厂自动化设备如何将数据采集到物联网云平台上

制造业工厂在进行生产管理、数字化转型升级的过程中&#xff0c;大量自动化设备的数据采集上云一直是困扰厂商的难题之一。因设备种类多、工艺复杂、设备老旧无多余通信接口导致数据无法集中、工艺无法实时管控&#xff0c;加上设备服务商的本地支持比较有限&#xff0c;因此设…

react-jwchat

react-jwchat: react-jwchat是一个基于React实现的web聊天组件。 如何阅读大型前端开源项目的源码 - 掘金 rollup专注以ESModule打包/自动treeshaking,更准确的来说rollup是小而美的打包工具 ts“typescript” ts是js类型的超集&#xff0c;被编译成纯js再执行 js&#xff…

阳康后是否二次感染,长新冠与肠道菌群的关联,多种潜在的干预措施

谷禾健康 随着大家陆续“阳康”&#xff0c;大家逐渐恢复以往的生活&#xff0c;城市的烟火气回来了。 然而阳康后真的万事大吉了吗&#xff1f; 还是有很多朋友处于这样的状态&#xff1a;感觉恢复了&#xff0c;又好像没有完全恢复&#xff0c;身体多少有点不适&#xff0c;开…

VirtualBox 虚拟机安装Windows10,珍藏版!!!

1、virtualbox管理器开始运行&#xff0c;点击【新建】按钮&#xff0c;开始新建虚拟电脑&#xff08;输入名称&#xff0c;修改路径&#xff0c;勾选版本等&#xff09;&#xff0c;如下图&#xff1b; 2、下一步&#xff0c;选择内存大小&#xff0c;默认推荐2048MB 3、创建后…

java基本类型转换

1.什么是类型转换&#xff1f; 因为java是一门强类型语言&#xff0c;所以在数据运算中会存在类型转换。 基本类型转换分为自动转换和强制转换。 自动转换规则&#xff1a;容量小的数据类型可以自动转换成容量大的数据类型&#xff0c;也可以说低级自动向高级转换。这儿的容量…

使用logstash把mysql同步到es,Kibana可视化查看

1&#xff1a;首先需要电脑本地有es环境&#xff0c;并且要牢记版本后&#xff0c;后续安装的logstash和Kibana一定要版本对应 查看es版本&#xff1a;http://localhost:9200/ 2&#xff1a;安装对应版本的logstash&#xff1a;找到自己对应ES版本&#xff0c;然后解压 Logst…

聚观早报 |微软正式将ChatGPT引入必应;百度将于3月上线ChatGPT

今日要闻&#xff1a;微软正式将ChatGPT引入必应&#xff1b;抖音否认3月全国上线外卖服务&#xff1b;百度将于3月上线ChatGPT产品&#xff1b;印尼跃升成全球第二大钴生产国&#xff1b;特斯拉在德国喜获“开年红” 微软正式将ChatGPT引入必应 2 月 8 日&#xff0c;据 CNET …

低代码开发平台|生产管理-成本核算搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建生产管理-成本核算。1.2、应用场景计算主生产及子生产计划的工序成本、领料成本&#xff0c;统计出总的生产成本金额。2、设置方法2.1、表单搭建1&#xff09;新建表单【商品信息】&#xff0c;字段设置如下&#xff1b;名称…

数据库模式(schema)是什么?

在数据库的术语中&#xff0c;模式&#xff08;schema&#xff09;是一个逻辑概念&#xff0c;用于组织数据库中的对象。模式中的对象通常包括表、索引、数据类型、序列、视图、存储过程、主键、外键等等。 模式可以为数据库对象提供逻辑隔离功能&#xff0c;不用应用程序可以…

基于libcurl 实现web-uploader客户端 大文件分片,断点续传(curl-uploader)

嵌入式设备Arm linux 基于libcurl 实现大文件分片上传&#xff0c;断点续传&#xff0c;分片大小可控&#xff0c;使用libcurl 实现web-upload linux c/c 客户端(curl-uploader)。通过wireshark 抓包网页版客户端上传文件过程&#xff0c;分析http post 流程。工程代码&#xf…

【排序算法】快速排序(Quick Sort)

快速排序(Quick Sort)使用分治法算法思想。快速排序介绍它的基本思想是: 选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一部分的所有数据都要小。然后&#xff0c;再按此方法对这两部分数据分别进行快速排…

SCADA软件平台数据库功能的应用

一、前言 SCADA系统是以计算机为基础的过程控制和调度自动化系统&#xff0c;它对工业现场的设备进行监视和控制&#xff0c;并实现数据采集与分析、设备运行控制、异常报警等。数据库系统作为SCADA系统中的重要组成部分&#xff0c;是进行数据采集、处理和存储的基础&#xf…

软件设计(八)

软件设计&#xff08;七&#xff09;https://blog.csdn.net/ke1ying/article/details/128927149 71、计算机系统主要是由 DRAM 构成的。 解析&#xff1a;随机访问存储器RAM有两类。 DRAM:(dynamic)动态随机访问存储器。SRAM比DRAM贵很多&#xff0c;DRAM电容很小&#xff0…

基于深度学习的安全帽监管系统

摘 要 安全生产管理是建筑、重工业等高危企业发展的重要方针,安全帽在施工生产环境中对人员头部防护起着关键作用,因此加强安全帽佩戴监管十分必要。近年来,基于图像视觉的安全帽佩戴监测方法成为了企业实施管理的主要手段,如何提高安全帽佩戴检测精度和检测速度是应用的关键难…

Linux系列文章 —— 进程概念(图解PCB、进程的描述、状态、创建、组织、查看详解)

系列文章目录 文章目录系列文章目录前言一、冯诺依曼体系结构二、操作系统三、进程概念进程概念描述进程&#xff08;PCB&#xff09;组织进程查看进程创建进程&#xff08;fork&#xff09;进程队列进程状态运行状态 - R睡眠状态 - S停止状态 - T僵尸进程 - Z孤儿进程进程优先…

不会做UI自动化测试?一起设计框架再实践吧

目的相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广大测试同学职业道…

Jmeter之实现参数化的不同方式详解

参数化简介 定义&#xff1a;动态的获取、设置或生成数据&#xff0c;是一种由程序驱动代替人工驱动的数据设计方案&#xff0c;提高脚本的编写效率以及编写质量 适用场景&#xff1a;当提交的数据量较大时&#xff0c;每次修改太麻烦&#xff0c;可以使用参数化 本文介绍实现…