面試題14:剪繩子

前序
動態(tài)規(guī)劃與貪婪算法
如果面試題是求一個問題的最優(yōu)解(通常是最大值和最小值)菱属,而且該問題可以分解為若干個子問題违诗,并且子問題之間還有重疊的更小的子問題,就可以考慮用動態(tài)規(guī)劃來解決這個問題分瘾。
動態(tài)規(guī)劃問題的第一個特點:求問題的最優(yōu)解
第二個特點:整體問題的最優(yōu)解依賴于子問題的最優(yōu)解该互。
第三個特點:大問題可以分解為若干個小問題,小問題之間還有相互重疊的更小的子問題辕宏。
第四個特點:從上往下分析問題畜晰,從下往上求解問題

貪婪算法和動態(tài)規(guī)劃不同,應(yīng)用貪婪算法解決問題時瑞筐,每一步都可以做出一個貪婪的選擇凄鼻,基于這個選擇我們確定能夠得到最優(yōu)解。

題目
給你一根長度為n的繩子聚假,把繩子剪成m段(m块蚌、n都是整數(shù)且m > 1, n > 1),m段繩子的長度依然是整數(shù),求m段繩子的長度乘積最大為多少膘格?

  • 比如繩子長度為8匈子,我們可以分成2段、3段闯袒、4段...8段,只有分成3段且長度分別是2游岳、3政敢、3時能得到最大乘積18

動態(tài)規(guī)劃的方式去解決,一共有n-1個分割方式去分割整體問題以及每一個子問題胚迫,設(shè)置一個長度為length+1的數(shù)組喷户,記錄各個分別為4到總長度為length的最大值,如果是長度2,3以及小于1访锻,直接返回其唯一的選擇乘積為1,2以及0褪尝。如果為4,則開始找最大乘積期犬,記錄在product中河哑,product初始設(shè)置為各自的下標(biāo)值,0龟虎,1璃谨,2,3。雙重循環(huán)佳吞,第一層表示f(n)=max(f(i)×f(n-i))中的n(4-length)拱雏,第二層是小于n的一半的數(shù),也就是函數(shù)中的i底扳,(1-n/2)
所以雙重循環(huán)保證找出不同對的組合铸抑,每次取之前找到的相應(yīng)位置的最大值,最后輸出最后一位衷模。

代碼如下:

//時間復(fù)雜度為O(n2),空間復(fù)雜度為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位置上直接設(shè)置長度,4以后選用區(qū)域最大值算芯,保證最大值是唯一的
         */
        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];

    }

貪婪法

/**
     * 時間和空間復(fù)雜度都為o(1)
     * 數(shù)學(xué)證明:
     * 1柒昏、當(dāng)n<5時,我們會發(fā)現(xiàn)熙揍,無論怎么剪切职祷,乘積product <= n,n為4時届囚,product最大為2*2=4有梆;
     * 2、當(dāng)n>=5時意系,可以證明2(n-2)>n并且3(n-3)>n泥耀。而且3(n-3)>=2(n-2)。所以我們應(yīng)該盡可能地多剪長度為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));
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凶硅,隨后出現(xiàn)的幾起案子缝裁,更是在濱河造成了極大的恐慌,老刑警劉巖足绅,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捷绑,死亡現(xiàn)場離奇詭異,居然都是意外死亡氢妈,警方通過查閱死者的電腦和手機粹污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來首量,“玉大人厕怜,你說我怎么就攤上這事。” “怎么了粥航?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵琅捏,是天一觀的道長。 經(jīng)常有香客問我递雀,道長柄延,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任缀程,我火速辦了婚禮搜吧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨凑。我一直安慰自己滤奈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布撩满。 她就那樣靜靜地躺著蜒程,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伺帘。 梳的紋絲不亂的頭發(fā)上昭躺,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音伪嫁,去河邊找鬼领炫。 笑死,一個胖子當(dāng)著我的面吹牛张咳,可吹牛的內(nèi)容都是我干的帝洪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脚猾,長吁一口氣:“原來是場噩夢啊……” “哼葱峡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起婚陪,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎频祝,沒想到半個月后泌参,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡常空,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年沽一,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓糙。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡铣缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝗蛙,我是刑警寧澤蝇庭,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捡硅,受9級特大地震影響哮内,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壮韭,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一北发、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喷屋,春花似錦琳拨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至是牢,卻和暖如春僵井,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驳棱。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工批什, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人社搅。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓驻债,卻偏偏與公主長得像,于是被迫代替她去往敵國和親形葬。 傳聞我的和親對象是個殘疾皇子合呐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容