链接
题目
给定一个正整数
n
,将其拆分为k
个 正整数 的和(k >= 2
),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。
示例
示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明
2 <= n <= 58
思路一(DP)
我们用dp[i]来表示分拆数字i,可以得到的最大乘积,对于每个i来说,都可以通过前面已知的拆分结果来求,遍历i前面的每个数字j,假设拆分成两个数 j 和 i-j ,这是一种情况,另外,j 又可以继续拆分,j拆分的最大值就是dp[j], 同理 i-j 也是一样的,我们在所有情况里取最大值就是dp[i]的结果。
C++ Code
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1,0);
dp[1]=1;
dp[2]=1;
for(int i=3;i<=n;i++)
{
for(int j=1;j<i;j++)
{
dp[i]=max({dp[i], j*(i-j), dp[j]*dp[i-j], dp[j]*(i-j)});
}
}
return dp[n];
}
};
思路二(数学)
我们在学高中数学的时候就学过,均分的时候乘积最大,但是,我们不知道将n均分成几个数,也不知道每个数均分成多少,因此就需要假设均分成x个数,每个数都是n/x,最大乘积就是,也就是求这个式子的最大值,可以得出当x=e的时候,乘积最大,e表示自然数,其值约为2.71828,但这里x只能为正整数,那么是2还是3呢?举个例子就知道了,假设n为12,如果均分后的每个数为2,答案是2^6=64,而如果均分后的每个数为3,答案就是3^4=81,显然将所有数均分成3更大。如果n=7,则分成3+3+1,n=8,则分成3+3+2,n=9,则分成3+3+3....依次类推
class Solution {
public:
int integerBreak(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int res = 1;
while (n > 4) {
res *= 3;
n -= 3;
}
res *= n;
return res;
}
};