Day 41 343.整数拆分 96.不同的二叉搜索树

news2024/11/22 20:13:35

整数拆分

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

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

示例 2:

  • 输入: 10
  • 输出: 36
  • 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
  • 说明: 你可以假设 n 不小于 2 且不大于 58。

​ 题解思路大致如下:

95BEC9AEC9CB8A1399C49FB3BBE4365C

​ 更加严格的证明如下(原题为1976年imo第四题):
1976IMO

​ 那么思路就明了了,对于n > 4的情况,尽可能的将数分解为3的和,递推公式即为dp[i] = dp[i - 3] *3;

​ 动态规划五部曲:

​ 1.确定dp数组及其下标含义:

​ 此处定义一维数组dp[i],下标i对应的是正整数的值,dp[i]则对应的是最大的正整数乘积;

​ 2.确定递推公式:

​ dp[i] = dp[i - 3]*3(i > 4)

​ 3.dp数组如何初始化:
​ dp[0] = 1, dp[1] = 1, dp[2] = 2, dp[3] = 4;即对应i <= 4的情况下的值,这样可以统一返回dp[i],不用做多次处理;

​ 4.dp数组应该如何遍历:

​ 本题很显然是从左到右顺序遍历;

​ 5.打印dp数组:

​ 1 1 2 4 6 9 12 18 27 36 54 81 108 162 ……

​ 代码实现如下:

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;

class Solution {
private:
	int integerBreak(int n) {
		vector<int> dp(n+1);

		//dp[0] = 1;//不用初始化,因为n >= 2
		if (n == 2)	return 1;
		else if (n == 3)	return 2;
		else if (n == 4)	return 4;
		else if (n == 5)	return 6;
		dp[1] = 1;
		dp[2] = 2;
		dp[3] = 4;
		dp[4] = 6;
		dp[5] = 9;
		for (int i = 6; i <= n; i++) {
			dp[i] = dp[i - 3] * 3;
		}
		return dp[n - 1];
	}
public:
	int test(int n) {
		return integerBreak(n);
	}
};
int main() {
	cout << "Please enter the target integer:(n >= 2)" << endl;
	int n;
	cin >> n;
	Solution mySolution;
	int res = mySolution.test(n);
	cout << "The Max product is:" << res << endl;
	cout << "the dp array will be shown as below:" << endl;
	for (int i = 2; i <= n; i++) {
		cout << mySolution.test(i) << " ";
	}
	cout << endl;
	return 0;
}

​ 很明显,这段代码是有很大的缺陷的,首先是初始化的过程太繁琐,理应有更简单的方法,其次由于初始化的时候已经初始化到了dp[5],所以一开始就需要n >= 4的时候才能正常运行,不然会报数组越界的错,最后就是这道题与其说是动态规划,更不如说是像贪心;

​ 重新考虑第二步递推公式:

​ 拆分整数有两种方法,即拆分成两数相乘和多数相乘:

​ 一个是j * (i - j) 直接相乘;

​ 一个是j * dp[i - j],相当于是拆分(i - j);

​ 考虑简化:

	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 - 1; j++) {
				dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
			}
		}
		return dp[n];
	}

不同的二叉搜索树

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

示例:

img

​ 先举例看看n = 1和n = 2时:

​ n = 3:

​ 当①为头节点时,其右子树的布局和n= 2的情况类似;

​ 当②为头节点时,其子树布局和n = 1时类似;

​ 当③为头节点时,其左子树布局也和n = 2时一致;

​ ①为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

​ ②为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

​ ③为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

​ 有2个元素的搜索树数量就是dp[2]。

​ 有1个元素的搜索树数量就是dp[1]。

​ 有0个元素的搜索树数量就是dp[0]。

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

​ 所以递推公式可以得到dp[i] += dp[j -1]*dp[i - j];

​ 递推五部曲:

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

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

​ 2.确定递推公式:

​ dp[i] += dp[j -1]*dp[i - j];

​ j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

​ 3.dp数组初始化:

​ 从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树;

​ 从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都为0;

​ 即dp[0] = 1;

​ 4.确定遍历顺序:

​ 由递归公式:dp[i] += dp[j -1]*dp[i - j];

​ 节点数为i的状态是依靠 i之前节点数的状态;

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
        dp[i] += dp[j - 1] * dp[i - j];
    }
}

​ 5.举例dp数组:

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

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

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

相关文章

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

深度学习之基于Resnet50卷积神经网络脊柱骨折CT影像图片诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 脊柱骨折是骨科中一种常见的损伤类型&#xff0c;准确的诊断对于患者的治疗和康复至关重要。传统的脊…

SPD1179 电路设计---汽车电机控制设计

概述 SPD1179 是旋智针对汽车应用推出的一颗高度集成的片上系统&#xff08;SOC&#xff09; 微控制器&#xff0c;内置 32 位高性能 ARMCortex-M4F 内核&#xff0c;最高 100MHz 的软件可编程时钟频率&#xff0c; 32KB SRAM&#xff0c; 128KB 嵌入式 FLASH&#xff0c; 1KB …

高级DBA教你达梦8国产数据库MergeInto批量插入并忽略主键重复报错特殊用法(达梦官方手册没有的内容)

高级DBA教你达梦8国产数据库MergeInto批量插入并忽略主键重复报错特殊用法&#xff08;达梦官方手册没有的内容&#xff09; 一、达梦8国产数据库简介 达梦 8 是一款由武汉达梦数据库有限公司基于 C/C语言开发的国产关系型数据库&#xff0c;有支持 X86 和 ARM 平台的版本&am…

【数据结构】 顺序表专题

目录 1.顺序表的概念及结构 1.1线性表 1.2顺序表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 1.顺序表的概念及结构 1.1线性表 线性表&#xff08;Linear List&#xff09;是数据结构中的一种基本结构&#xff0c;它是一个具有n个数据元素的有限序列。线性表的特点是数…

triton之fused attention

附录 【BBuf的CUDA笔记】十五,OpenAI Triton入门笔记三 FusedAttention - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/684557290图解大模型计算加速系列:FlashAttention V1,从硬件到计算逻辑 - 知乎 (zhihu.com)

MongoDB(四):条件操作符

条件操作 1、概述2、比较操作2.1、大于操作符-$gt2.2、大于等于操作符-$gte2.3、小于——$lt2.4、小于等于——$lte2.5、范围查询 3、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、…

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…

国产开源数据库厂商介绍

前言 开源数据库即免费的社区数据库,其源代码可供公众使用,并且可以在其原始设计中进行修改或使用。开源数据库的流行示例包括MySQL,PostgreSQL和MongoDB。开源数据库用户托管数据库部署的方式有内部部署、公共云、混合云。3. 互联网背景下,市场向互联网、移动化、数字化新…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-14-主频和时钟配置

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)

深入 YOLOv8&#xff1a;探索 block.py 中的构建块 YOLOv8&#xff0c;作为最新和最先进的对象检测模型之一&#xff0c;其核心架构由多个精心设计的构建块组成。这些构建块在 block.py 文件中定义&#xff0c;它们共同构成了 YOLOv8 的骨架。在本文中&#xff0c;我们将深入探…

【Java EE】多线程(三)线程状态

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

面试笔记——垃圾回收

对象被垃圾回收的时机 垃圾回收主要面向的是堆中的对象。简单一句就是&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;则有可能会被垃圾回收器回收。 如果要定位什么是垃圾&#xff0c;有两…

做题速度太慢了,面不上

没办法&#xff0c;之前练了一个月的sql。两个月不写&#xff0c;现在差不多忘干净了。工作空窗期&#xff0c;或者休息期不能太久&#xff0c;不然学再多的内容都可能会忘完的。 sql题&#xff0c;腾讯四道sql题&#xff0c;限时45分钟完成。我只做了一道&#xff0c;还没做完…

自动控制原理MATLAB:控制系统模型构建

在MATLAB中&#xff0c;常用的系统建模方法有传递函数模型、零极点模型以及状态空间模型等。 1系统传递函数模型描述&#xff1a; 命令格式&#xff1a; systf(num,den,Ts); 其中&#xff0c;num、den为分子多项式降幂排列的系数向量,Ts表示采样时间&#xff0c;缺省时描述…

ppp和ppp mp理论实验

ppp简介 PPP&#xff08;点对点协议&#xff09;为在点对点连接上传输多协议数据包提供了一个标准方法&#xff0c;是数据链路层封装协议的一种方法&#xff0c;支持同步和异步两种传输方式。&#xff08;除了PPP还有HDLC等&#xff0c;不过HDLC只支持同步方式&#xff09; P…

语音识别之衡量声音之间的距离-理解DTW

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

2024年学浪课程提取工具blog

2024年&#xff0c;如果你还在为提取学浪课程而烦恼&#xff0c;快来了解我们全新推出的学浪课程提取工具&#xff01;这是一款高效实用的工具&#xff0c;能一键提取并保存课程视频、音频和文档&#xff0c;让学习变得更加轻松愉快&#xff01;从此告别繁琐的下载和整理过程&a…

Tensor Cores 解密:解锁深度学习新篇章

Tensor Cores 使用介绍 概要介绍 TensorCore是英伟达GPU自Volta架构起支持的特性&#xff0c;允许CUDA开发者利用混合精度来显著提升吞吐量&#xff0c;且不影响精度。TensorCore在Tensorflow、PyTorch、MXNet和Caffe2等深度学习框架中得到广泛支持&#xff0c;用于深度学习训…

VBA在Excel中注册登录界面的应用

Excel工作表也可以做一个小程序,登录注册后可以访问或修改。为了简便,没有做复杂的控件,能说明问题就行。可以根据需要添加更多的判断条件,控制注册和访问人数。本次操作对注册没有任何限制,只要注册后就可以根据注册的账号和密码进行访问和修改。注册登录界面截图: 操作…