数学方法
2+2+2 = 3+3 但是 2 * 2 * 2 < 3 * 3的那么所有的数应该尽可能的分成3的和然后剩下的分成2,如果只剩下1,就少用一个3变成4,如果剩下一个2那就将3的累积乘以2,剩下0就直接返回3的累积就可以了
class Solution {
public:
int integerBreak(int n) {
if(n == 2)
return 1;
if(n == 3)
return 2;
int count = 0;
while(n >= 3)
{
count++;
n -= 3;
}
if(n == 0)
return pow(3, count);
if(n == 1)
return pow(3,count - 1) * 4;
return pow(3,count) * 2;
}
};
dp四部曲
- 确定dp[i]数组和下标的含义:dp[i]表示用拆分的最大积
- 确定转移方程:dp[i] = max(dp[i],max(dp[i-j]) * j, (i - j)*j)),dp[i]的最值可以通过j取值1–i-1乘以已经拆分的dp[i-j],此时dp[i - j]是拆分的,所以还有拆成两个数的情况,所以要取拆分成两个数和多个数的最大值
- 确定初始状态:只有在没用到1的时候才有可能最大,那么dp[2] = 1,dp[3] = 2,dp[4] = 4,dp[5] = 6,dp[6] = 9
- 确定遍历方向;
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 - 1; j ++)
{
dp[i] = max(dp[i], max(j * (i - j), dp[i - j] * j));
}
}
return dp[n];
}
};