力扣343 整数拆分

题目

给定一个正整数 n ,将其拆分为 k正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积

动态规划

定义:dpi表示将数字i拆分为至少两个正整数的和时,能得到的最大乘积

dpi的定义贯穿整个解题过程,后续所有推导都围绕如何通过更小的子问题求解dpi

对于每一个正整数i,第一步先把它拆分成i和i-j,此时的乘积为j*(i-j)

对于i-j来说,所有可能的拆分里,乘积最大的是max(j*(i-j),j*dp(i-j))

j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了

代码

cpp 复制代码
class Solution {
public:
    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/2;j++){
                dp[i]=max(dp[i],max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[n];
    }
};

参考文章

343. 整数拆分 - 力扣(LeetCode)https://leetcode.cn/problems/integer-break/代码随想录https://www.programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

相关推荐
来一碗刘肉面9 分钟前
串的定义与基本操作
数据结构
geovindu22 分钟前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法
三克的油30 分钟前
数据结构-1
数据结构
晚风叙码42 分钟前
C++ vector底层模拟实现与迭代器失效深度剖析
c++·算法
To_OC9 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_8414956410 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒14 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽16 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米16 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法