题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述
输出答案。
示例
输入
8
输出
18
分析
显然,当k[0]=k[1]=,=k[m]时乘积最大,设k[0]=x,那么乘积可以用下式表示
f(x)=(x)^(n/x)
扫描二维码关注公众号,回复: 11205847 查看本文章
求导得:在x=e时取得最大值,e≈2.718,是自然对数。
又因为x的取值只能为整数,且f(3)>f(2),所以,当n>3时,将n尽可能地分割为3的和时,乘积最大。 当n>3时,有三种情况,即n%3=0, n%3=1, n%3==2。
则:
- n%3=0时,f(x)=3^(n/3)
- n%3=1时,f(x)=4*3^(n/3-1)
- n%3=2时,f(x)=2*3^(n/3)
当n=2,n=3时作为特殊情况处理。
代码(已AC)
public class Solution {
public int cutRope(int target) {
if(target == 2) return 1;
if(target == 3) return 2;
if(target % 3 ==0){
return (int)Math.pow(3, target / 3);
}
else if(target % 3 == 1){
return 4 * (int)Math.pow(3, target / 3 - 1);
}else return 2 * (int)Math.pow(3, target/3); // target % 3 == 2
}
}