问题重述:
n可以拆分成多个(两个及以上)数的和,求这几个数最大的乘积;例如8=4+4,8=3+3+2,最大的乘积是3*3*2=18
代码如下:
public class Solution {
public int integerBreak(int n) {
int[] result = new int[n - 1];
if(n == 2) return 1;
else if(n == 3) return 2;
else if(n == 4) return 4;
result[0] = 2; //2
result[1] = 3; //3
result[2] = 4; //4
for(int i = 3; i < n - 1; i++){
result[i] = result[i - 3] * 3;
}
return result[n - 2];
}
}
思路:
设函数f(n)为所求结果,要求输入的n>4,f(n)定义如下:
f(n)=Math.max(2*f(n-2),3*f(n-3));
f(2)=2;(这个是为了计算更大的数而设定的值)
f(3)=3;(这个是为了计算更大的数而设定的值)
f(4)=4;
其中当n>4时,3*f(n-3)>=2*f(n-2),证明如下:
(1)n=5是3*f(n-3)=6=2*f(n-2)
(2)设n属于[5,x]时,3*f(n-3)>=2*f(n-2),也即n属于[5,x]时f(n)=3*f(n-3)
(3)当n=x+1时,需证3*f(n-2)>=2*f(n-1)
从2中可知,n属于[5,x]时f(n)=3*f(n-3)
不等式双方循环提取3并约分,将原不等式转化为:
3*f(a)>=2*f(a+1),其中a属于[2,4]
a=2时,左侧=6=右侧;
a=3时,左侧=9>右侧=8;
a=4时,左侧=12=右侧,(3)得证。
原命题的证。
所以f(n)=3*f(n-3);