《劍指offer》 014 剪繩子

2021-08-15 02:13:35 字數 1219 閱讀 9984

《劍指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的三段,此時得到最大的乘積18。

前提:

貪婪演算法:可自行網上搜尋,我的總結是,貪婪演算法是用最小的數求得最大的值

思路:

動態規劃:

①首先劃分子問題:設長度為n (n>=1),第一次剪繩子,為了使乘積最大,減長度為i,表示式為f(n)=f(n-i)*f(i);類似這樣進入遞迴;

②其次確定最終子問題的」狀態「:當長度為1,2,3,4的時候,最大乘積都只有一中選擇,分別對應為0,1,2,3;

③最後看狀態轉移表示式,if(max < f(n)) ,這個max的判斷需要用乙個迴圈來比較,比如想知道長度為5的繩子剪成兩段,求最大乘積,**可如下:

int

max=0;

for(int i=1;i<5/2;i++)

}

**如下:

int maxproductaftercutting_solution1(int

length)

}max = products[length];

free(products);

products = null;

return

max;

}

貪婪演算法:

用最小的數求得最大的值,在這個題中可以轉換成:用最短的繩子長度,得到最大的乘積,剪繩子的問題中,數值最小價值最大,就是指 2和3以及對應的2*2=4 3*3=9,因為2和3不能再拆分了,雖然不可拆分的資料有0 1 2 3,但是2 3的乘積相對來說最大,所以從2 3 兩個角度出發 用貪婪演算法得到近似最優解

**如下:

int maxproductaftercutting_solution2(int

length)

劍指offer014減繩子

給你一根長度為 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。示例 1 輸入 2...

劍指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 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此 時得到最大的乘積18。思路 動態規劃 任何動態規劃都是由遞迴演...