题目大意
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
解题思路
方法一:
动态规划,对于数字num,可以拆分成数字k和数字num-k。然后找到两者乘积最大值,就是num的结果。(至于题目说拆分成多个,这里拆分成了两个的原因:在计算数字k时,数字k就是拆分后的最大乘积,所以计算num时,看似只是k和num-k相乘,实质上是k的最大拆分结果和num-k的最大拆分结果相乘)
class Solution {
public:
int integerBreak(int n) {
if (n == 2)
return 1;
if (n == 3)
return 3;
vector<int> res(n, 1);
res[2] = 3;
for (int i = 3; i < n; ++i){
for (int j = 1; j < i; ++j){
res = max(res, res[j] * res[i - j]);
}
}
return res.back();
}
};
方法二:
贪心策略,分析后可以发现,每个数字的拆分结果都会变成若干个3相乘以及最多两个2相乘。(总感觉贪心策略不好理解,不太明白为啥)
int integerBreak(int n) {
if(n == 2)
return 1;
if(n == 3)
return 2;
int a = 1;
while(n > 4){
n = n - 3;
a = a * 3;
}
return a * n;
}