Given a positive integer n, break it into the sum of at leasttwo positive integers and maximize the product of those integers. Return the maximum product you can get.
Example 1:
Input: 2 Output: 1 Explanation: 2 = 1 + 1, 1 × 1 = 1.
Example 2:
Input: 10 Output: 36 Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
/* n分解为至少2个数的和 然后求这些分解中乘积最大的那种
* 如果是dp[i] 表示i拆分得到的最大结果
* 外循环 考虑数 内循环考虑拆分位置
* */
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1, 0);
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
dp[i] = max(dp[i], j*max(i-j, dp[i-j]));
}
}
return dp[n];
}
};
这道题其实是数学问题
如果按实数x拆分 总和sum 等价于 求导后x=e 那x取整数就考虑为2 or 3
当sum> 一定值时 按3拆分大于按2拆分得到的结果
验证一组数后 sum>=5 时拆分为3和一个小于3的数最好
class Solution {
public:
int integerBreak(int n) {
int ret[5]={0,0,1,2,4};
if(n<5) return ret[n];
n -= 5;
return (int)pow(3, (n / 3 + 1)) * (n % 3 + 2);
}
};