【算法题】剪绳子

题目描述

给你一根长度为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)

求导得:在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
    }
}
原创文章 28 获赞 22 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Steven_L_/article/details/105918663