给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
另dp[i]表示正整数i的最大乘积
把i拆分为i-j+j=i,j<=(i-1),因为如果j大于等于i那么乘积就不是正整数了,那么(i-j) * j
如果再把(i-j)也拆开,对应的乘积就是dp[i-j]*j
两个取最大值
class Solution {
public:
int integerBreak(int n) {
int *dp = new int[n + 1]();
dp[1] = 1;
for(int i = 2; i <= n; i++)
{
for(int j = 1; j < i; j++)
dp[i] = max(dp[i], max(dp[i-j]*j, (i-j)*j));
}
return dp[n];
}
};