題目
給你一根長度為n繩子,請把繩子剪成m段(m、n都是整數,n>1並且m≥1)。每段的繩子的長度記為k[0]、k[1]、……、k[m]。k[0]* k[1]*……*k[m]可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此 時得到最大的乘積18。
思路
動態規劃
任何動態規劃都是由遞迴演化出來的,因此先定義遞迴形式。
設f(n)為長度為n的繩子的最大乘積。
假設長度為n的繩子,我一刀切下去,可以從1切下去,那麼乘積為1*f(n-1),也可以從i切下去,也就是說最大值為max。
上面這個是遞迴形式。
可以發現,遞迴的話會有多次重複計算,比如f(4)需要算f(2)和f(3),f(5)也需要。因此採用動態規劃,用乙個o(n)的陣列來記錄中間的過程。
#include
using namespace std;
int cutting(int
length)
products[i]=max;
}int result=products[length];
deleteproducts;
return result;
}int main()
劍指Offer 剪繩子 和剪繩子
劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...
《劍指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的三段,此時得到的最大乘積是18 乘法計算,除了一以外,越多的數相...
劍指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的三段,此時得到的最大乘積是18。方法1 動態規劃 public ...