給定一個正整數 n,將其拆分爲至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/integer-break
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路分析
- 數學解答,可以發現在大多情況下,3越多積越大,餘下部分考慮1和2的解決:
當爲1時,加上一個3組成4;
當爲2時,直接乘上即可。 - 動態規劃
代碼分析
數學解答:
class Solution {
public:
int integerBreak(int n) {
if(n == 3)
return 2;
else if(n == 2)
return 1;
int num_3 = n / 3;
int num_low_3 = n % 3;
return num_low_3 == 2 ? pow(3,num_3) * 2 : (num_low_3 == 0 ? pow(3,num_3) : pow(3,num_3 - 1) * 4);
}
};
動態規劃
class Solution {
public:
int integerBreak(int n) {
if(n == 2)
return 1;
vector<int> dp(n + 1,0);
dp[2] = 1;
dp[3] = 2;
for(int i = 4;i <= n;++i){
for(int j = 2;j < i;++j){
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
};