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 复制代码
class Solution {
public:
    int integerBreak(int n) {
        // dp[i]: 拆分i,得到最大乘积为dp[i];
        // dp[i]:可以拆为dp[j] dp[i-j]
        //2、状态转移:dp[i] = max(j*(i-j),j*dp[i-j]);
        //分两种情况,拆为j 和 i-j
        //   1、i-j不能再拆了,那就是j*(i-j)
        //   2、i-j还能再拆,那就是j*dp[i-j]
        //也可以理解为 拆两个数 j*(i-j);拆三个即以上j * dp[i-j]; 
        //为什么不是dp[j]呢?我认为,再对j拆分,算是重复了,因为后面dp[i-j]已经拆过了,比方2*dp[4],上一个1*dp[5],对5拆分,可以得到1*1*2*2这个组合,也就是2*dp[4].所以不需要再对j拆分。
        vector<int>dp(n+1);
        dp[2] = 1;
        for(int i = 3;i <= n;i++){
            for(int j = 1;j < i;j++){ // j< i-1:j=i-1,在j = 1的时候dp[i-j]已经算过了
                //根据常识,数字越集中在一块,乘积越大,和越大。所以也可以j < n/2
                dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[n];
    }
};
相关推荐
我也不曾来过114 分钟前
list底层原理
数据结构·c++·list
A charmer20 分钟前
C++ 日志系统实战第三步:熟悉掌握各种设计模式
c++·日志系统
Ethon_王29 分钟前
STL容器适配器详解:queue篇
c++
静听夜半雨33 分钟前
CANoe入门——3、新建LIN工程及LIN DataBase(LDF文件)的创建
网络·数据库·c++·编辑器
梁下轻语的秋缘1 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV1 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
虾球xz2 小时前
游戏引擎学习第244天: 完成异步纹理下载
c++·学习·游戏引擎
矛取矛求2 小时前
C++区别于C语言的提升用法(万字总结)
c语言·c++
mit6.8242 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
keep intensify2 小时前
通讯录完善版本(详细讲解+源码)
c语言·开发语言·数据结构·算法