题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
示例1
输入
8
输出
18
分析1:
当绳子长度小于等于5时,直接返回结果。当绳子的部分长度大于等于5时,优先割长度为3的绳子。 max是多个3的累乘表示乘积
,到最后target小于5,后,就不用再割(长度为4时,不论割不割结果都是4)再乘上max返回就可以了。
为什么要优先割长度为3的绳子。书上是这样说的,当这部分长度大于等于5时(n>=5),满足式子3(n-3)>n且2(n-2)>n,如果不割则乘上n,如果以长度为3和长度为2来割乘上的值是大于n的,所以这个部分要以长度为3和2进行分割。又3(n-3)>2(n-2),即这种情况以长度为3来割乘积更大,所以这部分优先要割长度为3的绳子。
public class Solution {
public int cutRope(int target) {
int n = target;
int max = 1;
if ((n <= 3) && (n >= 0))
return n-1;
while (n > 4){
n - = 3;
max * = 3;
}
return max*n;
}
}
分析2:
题意长度为n,分割为m个部分。
在数学上,相当于求面积问题,当矩形是正方形面积最大。
假设当n长度的绳子被等分,每一小节长度为x,那么就有n = x*m,
那么一共分为m=n/x 节,那么数学表达式为:
Γ ( x ) = x n / x \Gamma(x) = x^{n/x} Γ(x)=xn/x
根据导数求证当x等于e时,函数最大,e=2.71828 因为题目取整数,所以为3,当取3的数倍段时,乘机最大。
当 n > 3时有三种情况,n%3 = 0 、n%3 = 1 、n%3 = 2
① n%3 = 0————
Γ
(
x
)
=
3
n
/
3
\Gamma(x) = 3^{n/3}
Γ(x)=3n/3
②n%3 = 1————
Γ
(
x
)
=
4
∗
3
n
/
3
−
1
\Gamma(x) = 4* 3^{n/3-1}
Γ(x)=4∗3n/3−1 必有4这一段,因为1没有意义
③n%3 = 2————
Γ
(
x
)
=
2
∗
3
n
/
3
\Gamma(x) = 2* 3^{n/3}
Γ(x)=2∗3n/3
上代码:
public class Solution {
public int cutRope(int target) {
int n = target;
if(n==2) return 1;
if(n==3) return 2;
else if(n % 3 ==0){
return (int)Math.pow(3,n/3);
}
if(n % 3 ==1){
return 4*(int)Math.pow(3,(n/3)-1);
}
if(n % 3 ==2){
return 2*(int)Math.pow(3,(n/3));
}
return 0; //必须要的函数结构
}
}