給你一根長度為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,2,3,…,n-1,因此f(n)=max(f(i)*f(n-i)),其中0這是乙個從上到下的遞迴公式。由於遞迴會有很多重複的子問題,從而會有大量不必要的重複運算。為了避免上述問題,我們不採用遞迴,從下而上來順序計算,即先計算f(1)接著計算f(2)…直到得到f(n)。
當繩子長度為2時,只能剪成兩段長度都為1的,因此f(2)=11=1,當繩子長度為3的時候可以剪成長度分別為1、2的兩段或者長度都為1的三段,因為111=1<12=2因此f(3)=2
**實現
public
static
intmaxproductaftercutting_solution1
(int length)
if(length==2)
if(length==3)
//products陣列第i個元素代表著長度為i的繩子剪成若干段之後各段長度乘積的最大值
//i>=4時上述概念有效
int[
] products=
newint
[length+1]
;//下面的初始化不代表著最大值,是為了方便i>=4的計算
products[0]
=0; products[1]
=1; products[2]
=2; products[3]
=3;int max=0;
for(
int i=
4;i<=length;i++)}
products[i]
=max;
} max=products[length]
;return max;
}
劍指offer 面試題14 剪繩子
給你一段長度為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。第一種是動態規劃 自下而上 public...
《劍指Offer》面試題14 剪繩子
要求 剪繩子 給你一根長度為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。測試用例 功能測試 ...
面試題14 劍指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.思路 利用動態規劃法,f n 表示...