前情提要
解决该问题之前先了解一个简单数学问题:已知周长一定为l的一条绳子,将绳子分割为长度为m,n的两节.问这时候长m与宽n在什么情况下,达到面积s最大
解题过程如下:
因为s = m*n;
又因为l = m+n;则n = l/2-m;
故:s(m) = m(l/2-m)。即s(m) = -m^2 + ml/2;
对上式进行求导:s(m)' = -2m + l/2
另 s' = 0; -2m + l/2 =0 => m = l/4。
(0,l/4)区间,s'>0,S单调递增
(l/4, n)区间,s'<0,S单调递减
l/4为极大值点
所以在长度x=n/4的时候,S的面积最大
所以n = l/2-m = l/2 - l/4 = l/4;
故当剪得长度,宽度一致的情况下面积最大。
回归本算法题目:
给你一根长度为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。
解题过程:类比上述案例截图过程。则有
1.分析题意:
绳子长度为n,分成m分,那先设分后每份长度为x, 份数m=n/x
那么结果就是 n/x个 x 相乘 f(x)=(n/x)
(n/x)
…*(n/x) = x^(n/x).
因为maxMul = f(x) = x^(n/x);
两边同时求对数,则有:ln(f(x)) = n/x(lnx);
两边同时求导。则有:
有上述求导过程可知。当x = 3时候。m = n/x有以下三种情况:
1. f(x) = 3^n/3 n%3 ==0;
2. f(x) = 3^(n/3-1)*4 n%3 ==1;
3. f(x) = 3^(n/3)*2;
注意:另外还需考虑绳子的长度小于3的情况。
完整代码如下:
public class Solution {
public int cutRope(int target) {
if(target == 2){return 1;}
if(target == 3){return 2;}
if(target >=4){
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);
}
}
return 0;
}
}
版权声明:本文为wxx520zyt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。