题目
给定一个正整数 n
,将其拆分为 k
个 正整数 的和( k >= 2
),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
动态规划
定义:dp[i]表示将数字i拆分为至少两个正整数的和时,能得到的最大乘积
dp[i]的定义贯穿整个解题过程,后续所有推导都围绕如何通过更小的子问题求解dp[i]
对于每一个正整数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