首页 > 其他 > 详细

剪绳子

时间:2020-06-27 22:27:30      阅读:94      评论:0      收藏:0      [点我收藏+]

题目描述

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

 

剪绳子

原文:https://www.cnblogs.com/ofmou/p/13200210.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!