算法学习打卡day40|343. 整数拆分、96.不同的二叉搜索树

news2024/11/30 10:43:48

343. 整数拆分

力扣题目链接
题目描述:
给定一个正整数 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。

思路:

  • 思路就是把整数拆分成两数之和,三数以上可以不用管,因为三数以上其实就是两数拆分的,我们就用两个数来做题,分别取第一个数和第一个数的dp之间的最大值,以及第二个数和第二个数dp之间的最值,然后相乘就是当前组的最大值,最后不断循环和dp[i]比较取最值即可。
  • 动态规划五部曲:
    1. 分析dp数组含义:dp[ i ]数组代表下标为i的整数拆分后元素乘积的的最大值
    2. 分析递推公式: dp[i] = max(dp[i], max(dp[i - j], i - j) * max(dp[j], j));
    3. dp数组初始化:因为我们拆分是从1开始拆分的那么下标0可以不用管,把下标1赋值为1,2也赋值为1,因为2只能拆分为1+1.
    4. 遍历顺序:显然是从前往后遍历,我们遍历的时候从下标i = 3开始,内层循环是去拆分i,比如3从1开始拆分为1和2,但是这里上界其实到 i / 2就可以了,多了就重复了。
    5. 推导数组结果:在这里插入图片描述

代码实现:

int integerBreak(int n) {
        /*
        dp[n] = max(dp[1]dp[n - 1],dp[2]dp[n - 2]..., dp[n / 2]dp[n - n / 2]);
        即:dp[i] = max(dp[i], max(dp[i - j], i - j) * max(dp[j], j));*/
        vector<int>dp(n + 1, 0);
        dp[1] = 1, dp[2] = 1;
        int left = 0, right = 0;
        for (int i = 3; i <= n; ++i) {
            for (int j = 1; j <= i / 2; ++j) {
                left = max(j, dp[j]);
                right = max(i - j, dp[i - j]);
                dp[i] = max(left * right, dp[i]);
            }
            
        }
        return dp[n];
    }
  • 这里left取最值那一步是可以省略的,为什么?
    • 因为代码实现方法是对j和i- j同时判断是否需要拆分,但是就算 j 它再怎么拆也是拆分成1 - i之间的某个元素再加上另外一个数或一组数(省去left取最值写法其实把这一个数或一组数包到dp[i - j]里了),所以,取到最值的时候,j 一定是1- i之间的某个值,然后dp序列是递增的,那么最值一定不在后 i / 2 里(随着基数增大),所以 j 的上界可以是 i / 2。
    • 数学证明如下(节选自力扣题解的某位同学回答):
      • 因为j * dp[i - j]包含了dp[j] * dp[i - j],这是可以证明的: 对j最优拆分:j = a1 + a2 +…+an; 对i - j 最优拆分:i - j = b1 + b2 +…+bn; 所以有 dp[j] = a1 * a2 … an; dp[i - j] = b1 * b2 *… bn; dp[i] * dp[i - j] = (a1 *a2 *…an) * (b1 * b2 … bn) = a1 * (a2 * … * an * b1 * b2 … bn) 令 k = a1,必有i - k = a2 + … + an + b1 + b2 +…+ bn(这就是对 i - k 的一种拆分) 也就是说如果以上这种对i - k的一种拆分是最优的,那么必有dp[j] * dp[i - j] = k * dp[i - k] 所以此时j * dp[i - j]包含dp[j] * dp[i - j]; 如果以上这种对i - k的拆分不是最优的,那这种拆分方案虽不会被j * dp[i - j]包含但也不会是答案;

96.不同的二叉搜索树

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

示例 1:
在这里插入图片描述
输入:n = 3
输出:5

思路:

  • 我的思路是这样的,1到n的每个数字都可以作为根节点,那么外层for循环还是老套度去求dp数组,内层for循环去决定哪个数子作为根节点,然后将左右节点的dp值乘起来,然后不断加到dp[i]上。
  • 动态规划五部曲:
    1. 分析dp数组含义:dp[ i ]数组代表下标为i的整数的二叉树种类
    2. 分析递推公式: dp[n] = dp[n - 1] * dp[0] + dp[n - 2] * dp[1] + ... + dp[1]*dp[n - 2] + dp[0]* dp[n - 1]
    3. dp数组初始化:因为我们左子树可以是0个节点,而且我们要做乘法,所以下标0赋值为1,把下标1也赋值为1,遍历的时候下标从2开始
    4. 遍历顺序:显然是从前往后遍历,我们遍历的时候从下标 i = 2开始,那么外层for循环还是老套度去求dp数组,内层for循环去决定哪个数子作为根节点,然后将左右子树节点数的dp值乘起来,然后不断加到dp[i]上。
    5. 推导数组结果:1 1 2 5 14…

代码实现

int numTrees(int n) {
        if (n < 2) return 1;
        //dp[n] = dp[n - 1] * dp[0] + dp[n - 2] * dp[1] + ... + dp[1]*dp[n - 2] + dp[0]* dp[n - 1]
        vector<int> dp(n + 1);
        dp[0] = 1, dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            for (int j = 1; j <= i; ++j) {
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }

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

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

相关文章

Panda3d 相机控制

Panda3d 相机控制 文章目录 Panda3d 相机控制Panda3d中的透视镜头和垂直镜头透视镜头垂直镜头 Panda3d 中用代码控制相机的移动用键盘控制相机的移动用鼠标控制相机的移动 Panda3d 把相机也当做是一个 PandaNode&#xff0c;因此可以向操作其他节点对其进行操作。 真正的相机是…

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道&#xff0c;可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…

Azure 机器学习 - 使用 AutoML 和 Python 训练物体检测模型

目录 一、Azure环境准备二、计算目标设置三、试验设置四、直观呈现输入数据五、上传数据并创建 MLTable六、配置物体检测试验适用于图像任务的自动超参数扫描 (AutoMode)适用于图像任务的手动超参数扫描作业限制 七、注册和部署模型获取最佳试用版注册模型配置联机终结点创建终…

Flask——接口路由技术

接口路由技术 一、Flask 简介1、环境安装&#xff1a;2、一个最小的应用3、两种运行方式 二、定义路由1、普通路由2、动态路由3、限定类型4、地址尾部的“/” 三、请求与响应-请求方法四、请求与响应-处理请求数据1、request的常用属性/方法2、get 请求参数3、json 请求4、表单…

高效文件整理:按数量划分自动建立文件夹,轻松管理海量文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件。然而&#xff0c;如何高效地整理这些文件却是一个棘手的问题。有时候&#xff0c;我们可能需要按照特定的规则来建立文件夹&#xff0c;以便更高效地整理文件。例如&#xff0c;您可以按照日期、时间或者特定的标签…

老杨说运维 | 历时180天,跟复旦大学共研的运维大模型终于来了!

写在前面 Q1&#xff1a;到处都在说的AI大模型到底是什么? ? ? A1&#xff1a;AI大模型是“人工智能预训练大模型"的简称&#xff0c;它包含了"预训练“和”大模型“两层含义&#xff0c;二者结合产生了一种新的人工智能模式即模型在大规模数据集上完成了预训练…

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML&#xff0c;通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…

【C语法学习】5 - fputc()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例24.3 示例3 1 函数原型 fputc()&#xff1a;将一个字符发送至指定流stream&#xff0c;函数原型如下&#xff1a; int fputc(int c, FILE *stream);2 参数 fputc()函数有两个参数c和stream&#xff1a; 参数c是待…

Proteus仿真--基于51单片机的按键控制LED仿真(仿真文件+程序)

本文主要介绍基于51单片机的按键控制LED仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 本仿真文件主要涉及4个按键&#xff0c;其中&#xff1a; K1按键的逻辑是——逐个点亮 K2按键的逻辑是——上四个点亮 K3按键的逻辑是——下四个点亮 K4按键的逻辑是——关…

opencv复习(很乱)

2-高斯与中值滤波_哔哩哔哩_bilibili 1、均值滤波 2、高斯滤波 3、中值滤波 4、腐蚀操作 卷积核不都是255就腐蚀掉 5、膨胀操作 6、开运算 先腐蚀再膨胀 7、闭运算 先膨胀再腐蚀 8、礼帽 原始数据-开运算结果 9、黑帽 闭运算结果-原始数据 10、Sobel算子 左-右&#x…

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

⾯向对象编程&#xff1a;封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战 一、封装数据和⾏为 结构体定义 定义了一个名为Structural的结构体。结构体是一种用户自定义的数据类型&#xff0c;可以包含不同类型的字段&#xff08;成员变量&#xff09;。 与…

【Unity编辑器扩展】艺术字/自定义图片字体生成工具

艺术字在游戏中很常用&#xff0c;由于普通字体样式过于平淡&#xff0c;制作花里胡哨的文字图片作为游戏字体使用&#xff0c;这就是艺术字。 不依赖第三方工具&#xff0c;仅使用Unity自带的Custom Font 一张艺术字图集就能实现这个功能&#xff0c;但是为了便于使用&#…

多伦多公共图书馆遭遇周末网络攻击,服务中断

多伦多公共图书馆&#xff08;TPL&#xff09;在10月28日星期六遭遇网络攻击后&#xff0c;警告称其许多在线服务已经中断。 作为加拿大最大的公共图书馆系统&#xff0c;TPL通过多伦多市内的100个分馆为人们提供1200万本图书的借阅服务。图书馆拥有120万注册会员&#xff0c;…

[SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务

目录 一、环境准备 1、工具准备 2、虚拟机环境 3、Docker 环境 二、项目准备 1、配置各个模块&#xff08;微服务&#xff09;的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计

FIR&#xff08;Finite Impulse Response&#xff09;滤波器是一种有限长单位冲激响应滤波器&#xff0c;又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性&#xff0c;同时其单位响应是有限长的&#xff0c;因而是稳定的系统&#xff0c;在数字通信、图像处理等领域…

MacOS安装git

文章目录 通过Xcode Command Lines Tool安装(推荐)终端直接运行git命令根据流程安装先安装Command Lines Tool后再安装git 官网下载二进制文件进行安装官方国外源下载二进制文件(不推荐)国内镜像下载二进制文件(推荐)安装git 通过Xcode Command Lines Tool安装(推荐) 简单来讲C…

性能压力测试主要目标及步骤

性能压力测试是软件开发生命周期中至关重要的一部分&#xff0c;旨在评估应用程序或系统在高负载和极端条件下的性能表现。这种测试有助于发现性能瓶颈、资源耗尽和错误&#xff0c;以确保应用程序在真实使用情况下的可靠性和稳定性。本文将探讨性能压力测试的概念、方法和最佳…

Distribution-Aware Coordinate Representation for Human Pose Estimation阅读笔记

主要研究人体姿态估计中heatmap转坐标的方法&#xff0c;提出一种新的解码方法 &#xff08;其实这人体姿态我毛也不会&#xff0c;过来看看这个heatmap解码方法&#xff09; 代码&#xff1a;https://github.com/ilovepose/DarkPose/blob/master/lib/core/inference.py 方法…

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

YOLOv5 分类模型的预处理

YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…