题目:
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
分析:
设dp[i]表示正数i拆分可以获得的最大值。
数 i 可以被分为 j 和 i-j 两部分,并且都比 i 小。
所以dp[i] 为这两部分的最大值的乘积。
由于i 已经分为了两部分,所以对于 j 和 i-j 而言,它们有两种选择,以j 为例:
1:不再拆分,值为他们本身 j。
2:继续拆分,值为dp[j]。
所以dp[i]的值为这两部分分别的最大值的乘积,即:
dp[i] = max(dp[j],j) * max(dp[i-j],i-j)
代码:
class Solution {
public:
int integerBreak(int n) {
int dp[n+1];
memset(dp,0,sizeof(dp));
dp[1] = 1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
dp[i] = max(dp[i], max(dp[j],j)*max(dp[i-j],i-j));
}
}
return dp[n];
}
};