剪绳子

题目描述

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),
每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度
是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
 

1. 迭代求解

长度为n的绳子最多可以剪n-1次。如果剪一次将绳子分为长度分别为i和n-i的两段,得到的长度为i*(n-i);

    public static int maxCut2(int length) {

        int f = 0;
     //*
      *当某一段绳子的长度小于4,此时不需要对这段绳子再分段,或者说不分段所得到的结果才是最大的。
      *这与长度为3的绳子可以得到的最大值2;长度为2的绳子可以得到的最大值1不同。 if (length<=4) { return length; }
     //剪绳子的对称性,不需要从1遍历到length for (int i=1;i<length/2+1;++i) { f=Math.max(f,i*maxCut2(length-i)); } return f; } public static int maxCut1(int i) { switch (i) { case 1: return 0; case 2: return 1; case 3: return 2; default: return maxCut2(i); } } public static void main(String[] args) { System.out.println(maxCut1(15)); }

2. 尽可能多的划分长度为3的段,同时不出现长度为1的段

public static int maxCut3(int target) {

        int f = 1;
        int timeof3 = target/3;
        if (target-timeof3*3==1) {
            timeof3--;
            f = 4;
        }
        if (target-timeof3*3==2){
            f= 2;
        }
        return (int) Math.pow(3,timeof3)*f;

    }

    public static void main(String[] args) {
        System.out.println(maxCut3(10));
    }

 

posted @ 2020-06-27 22:16  ofmou  阅读(153)  评论(0)    收藏  举报