Problem describe:
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
解法思路:
由于这道题存在最优字结构,这题我的思路是建立一个乘积数组,数组的下标i存放这i所能拆分之后的最大乘积,然后下标为n的数的最大乘积可以表示为两个更小的数所能拆分的乘积之和,而这两个更小的数可以进一步拆分,不过这一步已经被记录在乘积数组中了,我们不必再考虑进一步的拆分。代码如下
class Solution {
public int integerBreak(int n) {
int[] product =new int[n+1];
//product数组用来存放数i所能拆分的最大乘积
product[1]=1;
for(int i=1;i<=n;i++)
{
int a=1,b=i-1;
while(a<=b&&a+b==i)
{
int multi =(product[a]>a?product[a]:a)*(product[b]>b?product[b]:b);
//将数i拆分成a和b,要想产生最大乘积,我们需要选出a所拆分出的乘积和a本身中较大的一个数
if(product[i]<multi)
product[i]=multi;
++a;
--b;
}
}
return product[n];
}
}