經(jīng)典剪繩子問題

問題描述

《劍指offer》面試題14:剪繩子

給你一根長度為n的繩子,請把繩子剪成m段(n迄靠,m都是整數(shù)妻献,n > 1并且m > 1)晚碾,每段繩子的長度計為k[0],k[1],....,k[m]。請問k[0]k[1],....,*k[m]的最大值是多少扔字?

分析

n是給定的囊嘉,但m沒有給定温技,需要自己選擇將繩子剪成幾段能獲得最大值

遞歸法

考慮將m長的繩子剪成兩段,則最大值為max(1 * (m - 1),2 * (m - 2),3 * (m - 3) .......)
令f(n)為長度為n的繩子能獲得的最大值扭粱,則有遞推公式 f(n) = max(f(i) * f(n - i)) 0 < i < n舵鳞,由此能容易的寫出遞歸方法了

int fun1(int n)
{
    //因為必須分為兩段以上,所以長度小于4和大于4需要分開考慮
    if (n <= 1)
        return 0;
    if (n == 2)
        return 1;
    if (n == 3)
        return 2;
    return recursion(n);
}
//這個函數(shù)適用于n >= 4
int recursion(int n)
{
    //易知邊界條件,長度小于等于4的時候不切
    if (n <= 0)
        return 0;
    if (n <= 4)
        return n;
    int ans = 0;
    for (int i = 1; i <= n / 2; i++)
        ans = max(ans, recursion(i) * recursion(n - i));
    return ans;
}

動態(tài)規(guī)劃

將遞歸的方式改為從下到上計算琢蛤,先計算較短繩子的結(jié)果并保存在輔助空間中蜓堕,相比遞歸可以免去重復(fù)計算

int fun2(int n)
{
    if (n <= 1)
        return 0;
    if (n == 2)
        return 1;
    if (n == 3)
        return 2;
    //dp[i]表示長度為i的繩子能取得的最大乘積
    //dp[i]只使用i>=4的情況
    vector<int> dp(n + 1, 0);
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 3;
    for (int i = 4; i <= n; i++)
        for (int j = 1; j <= i / 2; j++)
            dp[i] = max(dp[i], dp[j] * dp[i - j]);
    return dp[n];
}

貪婪算法

當(dāng)n大于等于5時,我們盡可能多的剪長度為3的繩子博其;當(dāng)剩下的繩子長度為4時套才,把繩子剪成兩段長度為2的繩子。 為什么選2慕淡,3為最小的子問題背伴?因為2,3包含于各個問題中儡率,如果再往下剪得化挂据,乘積就會變小以清。 為什么選長度為3儿普?
因為當(dāng)n≥5時,3(n?3)≥2(n?2) 掷倔,3(n-3)≥2(n-2)眉孩。我沒法證明,但是是對的勒葱。

int fun3(int n)
{
    if (n <= 1)
        return 0;
    if (n == 2)
        return 1;
    if (n == 3)
        return 2;
    if (n == 4)
        return 4;
    //3的個數(shù)
    int cntof3 = n / 3;
    int remainder = n % 3;
    int ans = 1;

    //如果余數(shù)為1就少乘一個3 直接乘4
    if (remainder == 1)
    {
        cntof3--;
        ans = 4;
    }
    if (remainder == 2)
        ans = 2;
    for (int i = 0; i < cntof3; i++)
        ans *= 3;
    return ans;
}

有意思的想法

考慮繩子長度可以不為整數(shù)

此時變成一個有趣的數(shù)學(xué)問題浪汪,即求max(k[1]*k[2]*....*k[m])
其中k[i]表示第i段繩子的長度。
由算術(shù)-幾何平均數(shù)不等式可知算術(shù)平均數(shù)總是大于等于幾何平均數(shù),即
A_{n}=\frac{k[1]+k[2]+...+k[n]}{n}\geq \sqrt[n]{k[1]*k[2]*k[3]*...*k[n]}=C_{n}
當(dāng)且僅當(dāng)k[1]=k[2]=...=k[n]時取等號凛虽。因此每段繩子長度相等時能取得最大值死遭,設(shè)將繩子分為m段,每段長度 n/m,f(m) = (\frac{n}{m})^{m}
求f(m)的最大值凯旋,之后便是有趣的數(shù)學(xué)計算了呀潭。方程兩邊同時取對數(shù)ln^{f(m)}=mln^{(\frac{n}{m})}=m(ln^{n}-ln^{m})
對m求導(dǎo)令導(dǎo)數(shù)為零,求極值ln^{n}-(ln^{m}+1)=0\Rightarrow m=\frac{n}{e}
答案中出現(xiàn)了eV练恰D剖稹!荒椭,只要將一段繩子等長的分為n/e段谐鼎,每段長度為e,就能讓每段長度乘積最大Hせ荨狸棍!多么奇妙I砗Α!草戈!易知上面的函數(shù)只有一個極大值题造,也是函數(shù)最大值。上面的推導(dǎo)也可以說明貪婪法為什么優(yōu)先將繩子長度剪為3.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猾瘸,一起剝皮案震驚了整個濱河市界赔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牵触,老刑警劉巖淮悼,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揽思,居然都是意外死亡袜腥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門钉汗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羹令,“玉大人,你說我怎么就攤上這事损痰「3蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵卢未,是天一觀的道長肪凛。 經(jīng)常有香客問我,道長辽社,這世上最難降的妖魔是什么伟墙? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮滴铅,結(jié)果婚禮上戳葵,老公的妹妹穿的比我還像新娘。我一直安慰自己汉匙,他們只是感情好拱烁,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盹兢,像睡著了一般邻梆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绎秒,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天浦妄,我揣著相機與錄音,去河邊找鬼。 笑死剂娄,一個胖子當(dāng)著我的面吹牛蠢涝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阅懦,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼和二,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耳胎?” 一聲冷哼從身側(cè)響起惯吕,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怕午,沒想到半個月后废登,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡郁惜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年堡距,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兆蕉。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡羽戒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虎韵,到底是詐尸還是另有隱情易稠,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布劝术,位于F島的核電站缩多,受9級特大地震影響呆奕,放射性物質(zhì)發(fā)生泄漏养晋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一梁钾、第九天 我趴在偏房一處隱蔽的房頂上張望绳泉。 院中可真熱鬧,春花似錦姆泻、人聲如沸零酪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽四苇。三九已至,卻和暖如春方咆,著一層夾襖步出監(jiān)牢的瞬間月腋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榆骚,地道東北人片拍。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像妓肢,于是被迫代替她去往敵國和親捌省。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355