题目
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。
分析
n=10的话,那么两个数相加为10的可能性有9种,1+9 , 2+8, 3+7, 4+6, 5+5, 6+4, 7+3, 8+2, 9+1,在这里面1+9和9+1这种是重复的,有4个重复的,去掉重复的九还剩下:
1+9 , 2+8, 3+7, 4+6, 5+5 这些。然而题目的要求并不只单单是两数相加。
我们可以这样 继续算 1 + 9 ,1不可以再拆分, 9 = 1+8 =2+7 =3+6 = 4+5 ,
同时2+8, 3+7, 4+6, 5+5 这些也像上面拆分,拆分后的还可以继续拆分,拆分,
那么我们到最后呢 可以发现
如果n=10的话,其实我们只要知道1 2 3 4 5 6 7 8 9的最大乘积是多少,然后算一下1+9 , 2+8, 3+7, 4+6, 5+5 他们当中的最大乘积。
思路简单的说就是,我们从1开始依次推后面数字的最大乘积。
注意啦 题目的要求是没有n=0+n这种拆法的哦~
代码
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n+1];
dp[1]=1;
for (int i = 2; i < n+1; i++)
for (int j = 1; j < i/2+1; j++)
dp[i] = Math.max(Math.max(dp[j],j)*Math.max(dp[i-j],(i-j)),dp[i]);
return dp[n];
}
}