面试题14:剪绳子

前序
动态规划与贪婪算法
如果面试题是求一个问题的最优解(通常是最大值和最小值),而且该问题可以分解为若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。
动态规划问题的第一个特点:求问题的最优解
第二个特点:整体问题的最优解依赖于子问题的最优解。
第三个特点:大问题可以分解为若干个小问题,小问题之间还有相互重叠的更小的子问题。
第四个特点:从上往下分析问题,从下往上求解问题

贪婪算法和动态规划不同,应用贪婪算法解决问题时,每一步都可以做出一个贪婪的选择,基于这个选择我们确定能够得到最优解。

题目
给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m > 1, n > 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?

  • 比如绳子长度为8,我们可以分成2段、3段、4段...8段,只有分成3段且长度分别是2、3、3时能得到最大乘积18

动态规划的方式去解决,一共有n-1个分割方式去分割整体问题以及每一个子问题,设置一个长度为length+1的数组,记录各个分别为4到总长度为length的最大值,如果是长度2,3以及小于1,直接返回其唯一的选择乘积为1,2以及0。如果为4,则开始找最大乘积,记录在product中,product初始设置为各自的下标值,0,1,2,3。双重循环,第一层表示f(n)=max(f(i)×f(n-i))中的n(4-length),第二层是小于n的一半的数,也就是函数中的i,(1-n/2)
所以双重循环保证找出不同对的组合,每次取之前找到的相应位置的最大值,最后输出最后一位。

代码如下:

//时间复杂度为O(n2),空间复杂度为o(n)
    public static int maxProductAfterCutting(int length) {
        if (length<2){
            return 0;
        }
        if (length==2){
            return 1;
        }
        if (length==3){
            return 2;
        }
        /**
         * 多加一个长度,因为起始是从1开始
         * 123位置上直接设置长度,4以后选用区域最大值,保证最大值是唯一的
         */
        int[] products = new int[length+1];
        products[0] = 0;
        products[1] = 1;
        products[2] = 2;
        products[3] = 3;
        for (int i=4;i<=length;i++){
            int max = 0;
            //一半有效
            for (int j=1;j<=i/2;j++){
                //得到max{f(i)*f(n-i)}
                int product = products[j]*products[i-j];
                if (product > max){
                    max = product;
                }
            }
            //保存f(n)最大值
            products[i] = max;
        }
        return products[length];

    }

贪婪法

/**
     * 时间和空间复杂度都为o(1)
     * 数学证明:
     * 1、当n<5时,我们会发现,无论怎么剪切,乘积product <= n,n为4时,product最大为2*2=4;
     * 2、当n>=5时,可以证明2(n-2)>n并且3(n-3)>n。而且3(n-3)>=2(n-2)。所以我们应该尽可能地多剪长度为3的绳子段。
     * 化成尽可能多的长度为3的段,其中如果最后余1,则留下一个3提供给1,组成4,最后计算乘积
     * @param length
     * @return
     */
    public static int maxProductAfterCutting2(int length) {
        if (length<2){
            return 0;
        }
        if (length==2){
            return 1;
        }
        if (length==3){
            return 2;
        }
        //尽可能的找到可以分为多少个长度为3的段
        int countof3 = length/3;
        if (length%3 == 1){
            countof3--;
        }
        int countof2 = (length-countof3*3)/2;
        return (int)Math.pow(3,countof3)*(int)Math.pow(2,countof2);
    }
    public static void main(String[] args) {
        System.out.println(maxProductAfterCutting(8));
        System.out.println(maxProductAfterCutting2(8));
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容