给你一根长度为n的绳子,请把绳子剪成整数长的m段,每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多

  • Post author:
  • Post category:其他




前情提要



解决该问题之前先了解一个简单数学问题:已知周长一定为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 版权协议,转载请附上原文出处链接和本声明。