假设 n 不小于2且不大于58。
根据罗列的最大值结果,从n=5开始,拆分的结果都有数字3。
之后的数字,例如11,可以先拆出来1个3,然后再看余下的8如何拆分。
问题:为何只能取到58?
解决:int最大值为2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647。
如果n=59,则分成19个3+2,结果为2*3^19=288230376151711740,超界。
换成长整型:
public static long interBreakProblem(long n) {
if(n==2 || n==3)
return n-1;
if(n==4) return n;
long result=1;
while(n>4) {
result*=3;
n-=3;
}
return result*n;
}
解题思路:
对n除3取整得a,若余1,则max=4*3^(a-1);若其它,则max=(n-3^a)*3^a。
问题:为什么是3的幂次最大,而不是2、4或其它呢?
解决:问学方程的同学,说参考柯西不等式???黑人问号。之前印象中一个:A+B+C=X,取最大Y=A*B*C,当且仅当A=B=C。此题,n=9时,貌似合理。待解。
如果用逐层遍历取每一层的最大值,后输出最终的最大值:
public static int integerBreak(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
for(int i = 2; i <= n; i ++) {
for(int j = 1; j < i; j ++) {
dp[i] = Math.max(dp[i], (Math.max(j,dp[j])) * (Math.max(i - j, dp[i - j])));
}
}
return dp[n];
}
问题:n最大值为58