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

整数拆分

给定一个正整数 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];
    }
};

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

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

相关文章

Java基础教程 - 5 数组

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 5 数组 前面我们保存数据…

前端基础学习html(1)

1.标题标签.h1,h2...h6 2.段落标签p 换行标签br 3.加粗strong(b) /倾斜em(i) /删除 del(s) /下划线ins(u) 4.盒子&#xff1a;div //一行一个 span//一行多个 5.img :src alt title width height border 图片src引用&#xff1a;相对路径 上级/同级/中级 绝对路径&#xff…

直播话术核心逻辑,学了轻松提高销量!沈阳直播运营培训

直播话术到底该怎么说&#xff1f; 产品话术说得好&#xff0c;直播间一次就能卖出去上万件产品&#xff1b;产品话术说不好&#xff0c;直播间半个月也卖不出去10件产品。 我们上次就有跟大家说过产品话术的具体流程&#xff0c;但发现还有更多朋友居然还是不能够很好地完成一…

2024/5/6 QTday1

自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(350,470);this->setFixedSize(350,470);//窗口标题this-&g…

一个简单的仓库出入库管理软件的流程是什么样的?有哪些功能?

身为仓库文员&#xff0c;我深知仓库管理对于公司运营的重要性。仓库是公司物资的中转站&#xff0c;其管理的好坏直接关系到公司的运营效率和成本控制。然而&#xff0c;传统的仓库管理方式往往存在着效率低下、易出错等问题&#xff0c;为了解决这些问题&#xff0c;我们需要…

uboot图形界面配置

文章目录 一、环境安装二、配置默认项2.图形界面 三、图形配置项的来源1.mainmenu主界面 一、环境安装 &#x1f4a6;uboot 或 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面&#xff0c;menuconfig是一套图形化的配置工具&#xff0c;需要 ncurses 库支持。…

2024年电工杯数学建模竞赛A题B题思路代码分享

您的点赞收藏是我继续更新的最大动力&#xff01; 欲获取更多电工杯学习资料&#xff0c;可点击如下卡片链接 点击链接加入群聊【2024电工杯】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k_PrjarulWZU8JsAOA9gnj_oHKIjFe195&authKeySbv2XM853pynlnXiv6M58…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

网络聊天室:通过Servlet和JSP,结合session和application实现(文末附源码)

目录 一.成品效果 二.代码部分 chat.jsp ChatServlet 一.成品效果 在启动成功后&#xff0c;我们就可以在任意俩个浏览器页面中相互发消息&#xff0c;如图所示左边屏幕使用的是Edge浏览器&#xff0c;右图使用的是火狐浏览器。当然笔者这里只是简单实现最基本的一些功能&…

【LeetCode刷题记录】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,1…

Linux--IIC驱动编程实验

对于 I2C 主机驱动&#xff0c;一旦编写完成就不需要再做修改&#xff0c;其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想&#xff0c;因此 Linux内核也将 I2C 驱动分为两部分&#xff1a; ①、 I2C 总…

盘一盘接口测试的那些痛点,你现在会解决了吗

前言 说到接口测试&#xff0c;想必大家一定不会陌生。接口测试就是测试系统组件间&#xff0c;接口对接是否顺畅的一种测试。包括测试数据能否交换、能否传递、能否正常控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系&#xff0c;等等。 由于接口测试主要是检测系统…

5月3日江苏某厂冷却塔清洗工作汇报-智渍洁

5月3日 施工人员&#xff1a;张能超&#xff0c;张伟&#xff0c;刘平&#xff0c;曾巧 施工事项&#xff1a;空冷器脱脂 今日工作进度&#xff0c;清洗6台遇到的问题&#xff0c;就是那个喷雾器不经用&#xff0c;一会儿又坏了 重庆智渍洁环保科技有限公司专注于工业清洗&…

使用ThemeRoller快速实现前端页面风格美化

使用ThemeRoller快速实现前端页面风格美化 文章目录 使用ThemeRoller快速实现前端页面风格美化一、ThemeRoller二、使用方法1.基本操作面板介绍2.直接用现成的配色风格——Gallery画廊3.自定义风格——Roll Your Own4.下载风格包并应用到页面 一、ThemeRoller ThemeRoller是jQ…

欢乐钓鱼大师脚本,游戏托管一键操作!

欢迎来到《钓鱼大师乐趣无穷》&#xff01;这里是一片充满了乐趣和挑战的钓鱼天地。不论你是刚刚入门的小白&#xff0c;还是已经成为老手的大神&#xff0c;本攻略将为你揭示如何在游戏中获得成功&#xff0c;并针对稀有鱼类的钓鱼技巧进行详细介绍。 一、初探钓鱼的乐趣 在《…

GEE错误——image.reduceRegion is not a function

简介 image.reduceRegion is not a function 这里的主要问题是我们进行地统计分析的时候&#xff0c;我们的作用对象必须是单景影像&#xff0c;而不是影像集合 错误"image.reduceRegion is not a function" 表示你正在尝试使用reduceRegion()函数来处理图像数据&…

MySQL数据库—多表设计(有这一篇够!)

▐ 数据库设计范式 • 第一范式&#xff1a;确保每列保持原子性 ( 列不可再分解 ) 例如联系方式包括&#xff1a;电话/邮箱/微信... 那么我们设计表时就需要将它具体化 • 第二范式&#xff1a;要有主键&#xff0c;通过主键可以精确的定位到某行数据. 其他字段都依赖于主…

JAVA----Thread(2

Thread 提供的属性和方法 目录 Thread 提供的属性和方法一.构造方法1.Thread() :2.Thread(Runnable target) :3.Thread(String name) :main 线程 4.Thread(Runnable target, String name) : 二.属性1.ID (getId)2.名称(getName)3.状态(getState)4.优先级 (getPriority)5.是否后…

如何用中医揿针治疗肩周炎?

点击文末领取揿针的视频教程跟直播讲解 首先我们先来了解什么是肩周炎 【中医辨证】 肩周炎中医称之为漏肩风、锁肩风、肩凝症等&#xff0c;将肩周炎的一系列症状归纳为痹证的范畴&#xff0c;故又有肩痹、肩胛周痹等病名。 在中医古典医籍《素问痹论》中有骨痹、筋痹、脉…

LangChain Agent最全教程学习

LangChain Agent的终极指南&#xff0c;本教程是您使用 Python 创建第一个agent的重要指南&#xff0c;请立即开始你的 LLM 开发之旅。 一、什么是LangChain Agent&#xff08;代理&#xff09; LangChain中代理背后的想法是利用语言模型以及要执行的一系列操作。代理正在使用…