題目:給你一根長度為n的繩子,請把繩子剪成m段(m、n都是整數,n>1並且m>1),每一段的長度記為k[0],k[1],...k[m].請問k[0]xk[1]x...xk[m]可能 的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18.
我們有兩種不同的方法解決這個問題。先用常規的需要o(n^2)時間和o(n)空間的動態規劃的思路,接著用只需要o(1)時間和空間的貪婪演算法來分析解決這個問題。
動態規劃
首先定義函式f(n)為把長度為n的繩子剪成若干段後各段長度乘積的最大值。在剪第一刀的時候,我們有n-1種可能的選擇,也就是剪出來的第一段繩子的可能長度為1,2,...n-1。因此f(n)=max(f(i)xf(n-i)),其中0這是乙個從上至下的遞迴公式。由於遞迴會有很多重複的子問題,從而有大量不必要的重複計算。乙個更好的辦法是按照從下而上的順序計算,也就是說我們先得到f(2)、f(3),再得到f(4)、f(5),直到得到f(n)。
當繩子的長度為2時,只可能剪成長度為1的兩段,因此f(2)等於1.當繩子的長度為3時,可能把繩子剪成長度為1和2的兩段或者長度都為1的三段,由於1x2>1x1x1,因此f(3)=2
#include #include #include using namespace std;
int cutrope(int number)
for(int i=4;i<=number;i++)
dp.at(i)= tempmax;
}return dp[number];
}int main()
return 0;
}
動態規劃 剪繩子
include include include using namespace std 題目 給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度為8時,我們把它剪成...
剪繩子(貪心 動態規劃)
準備找工作,開始刷題,牛客劍指offer 給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 xk 1 x.xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到...
動態規劃之二 剪繩子問題
問題 現有一根長度為n的繩子,需要你剪成m段,使m段的乘積最大。其中m n都為整數,剪成的每段長度也為整數,n已知,m未知 當我們遇到乙個大規模問題時,總是習慣把問題的規模變小,這樣便於分析討論。我們從最簡單的情況進行分析 當繩子的長度n 1時,我們至少需要剪繩子一次,這時乘積為0 當繩子的長度為n...