本题两种思路
一种直接用动态规划求解
维护一个tag数组,tag【1】=1,之后tag[i] =Math.max(tag[i],j*Math.max(tag[i-j], i-j));即可得到结果 代码如下:
class Solution {
public int integerBreak(int n) {
int tag[] = new int[n+1];
tag[1] = 1;
for (int i = 2; i < tag.length; i++) {
for (int j = 1; j <i; j++) {
tag[i] =Math.max(tag[i],j*Math.max(tag[i-j], i-j));
}
}
return tag[n];
}
}
另一种是庄华为数学问题,我们发现当n》5时,拆分为3会得到最大值。
由均值不等式(n个数的算术平均数大于等于它们的几何平均数):
>=
得:当把输入的n拆分成几个相等的数时它们的积最大。
那么问题来了,拆分成几个呢?
为了方便使用导数,我们先假设我们可以把n拆分成实数。那么设每一个数为x,则一共有n/x个数。
设它们的积为f(x),则f(x)=x(n/x),那么怎么求f(x)最大值呢?求导数!
f′(x)=(n/x2) * x(n/x) * (1-lnx)
当x=e时取极大值。
而我们题目里规定x为整数,那么我们只需要取的x越靠近e越好。那么2<e<3,而且e=2.71828...,所以取3是最好的,如果取不到3就取2。
代码如下
public class Solution {
public int integerBreak(int n) {
if(n==2) return 1;
if(n==3) return 2;
int product = 1;
while(n>4){
product*=3;
n-=3;
}
product*=n;
return product;
}
}