力扣日记4.10-【动态规划篇】343. 整数拆分

力扣日记:【动态规划篇】343. 整数拆分

日期:2024.4.10
参考:代码随想录、力扣

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。

提示:

  • 2 <= n <= 58

题解

cpp ver
class Solution {
public:int integerBreak(int n) {/* 思路:求一个数拆分之后能得到的最大乘积:则可以尝试把该数拆成2个数、3个数、...等,分别看各种情况的值,再取最大值这里运用动规的关键是,怎么用递推关系表示拆分首先定义dp[i] 表示将 i 拆分之后(注意dp包含了拆分的意味) 可以获得的最大乘积则对一个数 i , 其拆分可表示为两种情况:一是拆成两个数,即 j * (i - j)(这里 j 从 1 遍历到 i-2 ,因为 i - j 要 >= 2 才有意义)二是拆成三个数及以上,表示为 j * dp[i-j] (注意 dp[i-j] 包含了将 i-j 拆成更小的数的情况)而至于 j 拆成更小的数的情况,已经包含在遍历过程中 遍历到 j-1,j-2 等的情况里了所以 dp[i] = max_j { max{j*(i-j), j*dp[i-j]} } 注意有两层max,即先从两种情况下选出最大值,再找到哪一个j对应的dp[i]最大*/// 定义 dp 数组vector<int> dp(n + 1);// 初始化,这里dp[0]和dp[1]没有意义,因为不能拆分,所以从2开始初始化dp[2] = 1; // 2 只能拆成2个1,不能包含在递推中// 遍历:对 i 从 3 遍历到 n;对 j 从 1 遍历到 i-2(如果要优化,可以遍历到 i/2,因为只有让拆出来的数尽可能大小接近,才能得到最大乘积)for (int i = 3; i <= n; i++) {  // 遍历 i 得到 dp[i]int max_dp_i = 0;for (int j = 1; j <= i - 2; j++) { // 遍历 j,看 j 取哪一个值能得到 dp[i] 的最大值int cur_dp_i = max(j * (i - j), j * dp[i - j]);max_dp_i = max(cur_dp_i, max_dp_i);  // 看当前j对应的dp[i]是否是最大dp[i]// 也可以直接表示成 dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))}dp[i] = max_dp_i;   // 记录max_dp_i为真正的dp[i]}return dp[n];}
};

复杂度

时间复杂度:O(n * n)
空间复杂度:O(n)

思路总结

  • 思路:求一个数拆分之后能得到的最大乘积:则可以尝试把该数拆成2个数、3个数、…等,分别看各种情况的值,再取最大值
  • 这里运用动规的关键是,怎么用递推关系表示拆分
    • 首先定义dp[i] 表示将 i 拆分之后(注意dp包含了拆分的意味) 可以获得的最大乘积
    • 则对一个数 i , 其拆分可表示为两种情况:
      • 一是拆成两个数,即 j * (i - j)(这里 j 从 1 遍历到 i-2 ,因为 i - j 要 >= 2 才有意义)
      • 二是拆成三个数及以上,表示为 j * dp[i-j] (注意 dp[i-j] 包含了将 i-j 拆成更小的数的情况)
      • 而至于 j 拆成更小的数的情况,已经包含在遍历过程中 遍历到 j-1,j-2 等的情况里了
    • 所以 dp[i] = max_j { max{j*(i-j), j*dp[i-j]} }
      • 注意有两层max,即先从两种情况下选出最大值,再找到哪一个j对应的dp[i]最大

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

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

相关文章

Ubuntu Desktop Server 快捷键

Ubuntu Desktop Server 快捷键 1. Desktop shortcut key2. Terminal shortcut keyReferences 1. Desktop shortcut key Ctrl Alt T&#xff1a;打开终端 Ctrl Alt F1 ~ F6&#xff1a;终端界面 (terminal or console) tty1 ~ tty6 Ctrl Alt F7&#xff1a;图形界面 Ctrl…

基于springboot实现医院管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现医院管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求&#xff0c;创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系…

JAVA学习-深入研究容器.理解Map

Map是Java集合框架中的一种容器&#xff0c;它用来存储键值对&#xff08;key-value pairs&#xff09;。 一、Map接口的实现类有很多&#xff0c;常用的有HashMap、TreeMap和LinkedHashMap。 1. HashMap: - 特点&#xff1a;基于哈希表实现&#xff0c;无序存储&#xff0c;…

qt自定义窗口在拖动过程中出现抖动且拖动后位置看上去不对

自定义窗口拖动 引言开发环境关键性代码运行结果原因分析改进代码运行结果globalPos()globalPosition()再次修改代码运行结果区别 引言 本文旨在一个问题的记录&#xff1a;自定义窗口拖动的过程中&#xff0c;窗口不能很好的跟随鼠标移动&#xff0c;此外会出现窗口拖动时抖动…

蓝桥杯赛前模拟

A-似巨龙高歌 题意 对考试的名次重新排序&#xff0c;使得进步最大的进步名次最少。 思路 按照名次从小到大进行排序&#xff0c;这样保证了进步的名次最少&#xff0c;从而取进步的最大值。 代码 #include<bits/stdc.h> #define PII pair<int,int> using n…

Kubernetes(k8s)监控与报警(qq邮箱+钉钉):Prometheus + Grafana + Alertmanager(超详细)

Kubernetes&#xff08;k8s&#xff09;监控与报警&#xff08;qq邮箱钉钉&#xff09;&#xff1a;Prometheus Grafana Alertmanager&#xff08;超详细&#xff09; 1、部署环境2、基本概念简介2.1、Prometheus简介2.2、Grafana简介2.3、Alertmanager简介2.4、Prometheus …

绿联 安装火狐浏览器(Firefox),支持访问路由器

绿联 安装火狐浏览器&#xff08;Firefox&#xff09;&#xff0c;支持访问路由器 1、镜像 linuxserver/firefox:latest 前置条件&#xff1a;动态公网IP。 已知问题&#xff1a; 直接输入中文时&#xff0c;不能完整输入&#xff0c;也可能输入法无法切换到中文&#xff0c;可…

【阿里淘天笔试题汇总】2024-04-10-阿里淘天春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新淘天近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

Golang教程四(协程,channel,线程安全,syncMap)

目录 一、Goroutine和channel Goroutine Channel 发送和接收操作 缓冲 Channel 关闭 Channel 使用 Channel 进行同步 Select语句 协程超时处理 方法一&#xff1a;使用context.Context 方法二&#xff1a;使用time.Timer/time.Ticker 二、线程安全与sync.Map 线程安…

Vue3大事件项目1 登录注册验证

创建项目 引入 element-ui 组件库 登录&#xff1a;注册样式准备之后&#xff0c;配置校验规则&#xff08;4个条件&#xff1a;一数据、二规则&#xff09; 1. 校验相关 (1) 给当前表单绑上整个的数据对象&#xff1a;el-form > :model"ruleForm" 绑…

二叉树总结

递归返回值 1、如果需要搜索整棵二叉树且不用处理递归返回值&#xff0c;递归函数就不要返回值。 2、如果需要搜索整棵二叉树且需要处理递归返回值&#xff0c;递归函数就需要返回值。 3、如果要搜索其中一条符合条件的路径&#xff0c;那么递归一定需要返回值&#xff0c;…

Notepad++软件安装及配置说明

Notepad是 Windows操作系统下的一套文本编辑器&#xff0c;有完整的中文化接口及支持多国语言编写的功能。 Notepad功能比 Windows自带记事本强大&#xff0c;除了可以用来制作一般的纯文字说明文件&#xff0c;也十分适合编写计算机程序代码。Notepad不但可以显示行号&#xf…

1572. 【基础赛】涂色(paint)

1572. 【基础赛】涂色&#xff08;paint&#xff09; (Input: paint.in, Output: paint.out) 时间限制: 2 s 空间限制: 256 MB 具体限制 题目描述 Introl获得了一个N行的杨辉三角&#xff0c;他将每行中值为奇数的位置涂为了黑色。 Chihiro将提出M次询问&#xff0c;在第L…

Day2 字符串哈希KMP

字符串哈希 KMP 基本 字符串哈希 理论 将一个字符串转成一个数字&#xff0c;可以快速比较两个字符串是否相同等。要求为&#xff1a;相同字符串哈希值相同&#xff0c;不同字符串哈希值尽量不相同。 映射方法通常采用多项式哈希方法&#xff0c;很像进制转换。假设字符串为…

Tomcat服务

Tomcat服务 安装 安装java环境 yum install -y java-1.8.0-openjdk java -version # 看是否成功安装Tomcat&#xff0c;这里以apache-tomcat-8.0.30.tar.gz为例 tar -xvf apache-tomcat-8.0.30.tar.gz -C /usr/local/ mv /usr/local/apache-tomcat-8.0.30 /usr/local/tomc…

萝卜大杂烩 | 10 个杀手级的 Python 自动化脚本

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;10 个杀手级的 Python 自动化脚本 重复性任务总是耗时且无聊&#xff0c;想一想你想要一张一张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作…

ELK日志

​​​​​​​

HJ53 杨辉三角的变形(基础数学,生成数组不行,会越界,使用规律)

第一种方法&#xff1a; 生成杨辉三角的方法不行&#xff0c;会出现越界&#xff0c; 数组从[0][0]开始&#xff0c;i行j列 只看列 每一行的最右侧坐标为2*i,下坐标为 0&#xff0c; 0&#xff0c;1&#xff0c;2 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 … …

MongoDB聚合运算符:$not

文章目录 语法使用举例 $not聚合运算符用于将指定布尔表达式的值取反&#xff0c;比如&#xff0c;表达式的值为 true&#xff0c; $not返回 false&#xff1b;表达式的值为 false&#xff0c; $not则返回 true。 语法 { $not: [ <expression> ] }使用 除false外…

革命性突破:Stability AI发布全新12B参数Stable LM 2模型,颠覆AI界!

Stability AI已推出其Stable LM 2语言模型系列的最新成员&#xff1a;一个120亿参数的基础模型和一个经过指令调优的变体。这些模型在七种语言上训练&#xff0c;包括英语、西班牙语、德语、意大利语、法语、葡萄牙语和荷兰语&#xff0c;训练数据达到了令人印象深刻的两万亿个…