面試題14 剪繩子

2021-09-29 11:40:09 字數 1752 閱讀 4966

給你一根長度為n的繩子,請把繩子剪成m段(mn都是整數,2 ≤ n ≤ 58並且m ≥ 2)。

每段的繩子的長度記為k[0]、k[1]、……、k[m]k[0] × k[1] × … × k[m]可能的最大乘積是多少?

例如當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到最大的乘積18

樣例

輸入:8

輸出:18

定義狀態:f(n)表示把長度為n的繩子剪成若干段後各段長度乘積的最大值。

轉移方程:

在剪第一刀的時候我們有n-1種選擇,即剪出來的第一段繩子的可能長度分別為1,2,...,n-1。因此

f (n

)=ma

x,其中0

<

i<

nf(n) = max\, \text 0f(

n)=m

ax,其中

0<

i<

n**:

class

solution

private

intrecursion

(int length)

products[length]

= res;

return res;

}}

class

solution

}return products[length];}

}

貪心策略:

證明:

n >= 5時,可以證明 2(n

−2

)>

n2(n-2)>n

2(n−2)

>

n,並且 3(n

−3

)>

n3(n-3)>n

3(n−3)

>

n。也就是說,當繩子剩下長度大於或者等於5的時候,可以把它剪成長度為3或者2的繩子段。

n >= 5時,3(n

−3

)>=2

(n−2

)3(n-3)>=2(n-2)

3(n−3)

>=2

(n−2

),因此,應該盡可能多地剪長度為3的繩子段。

n = 4時,在長度為4的繩子上剪一刀,有兩種可能得結果:剪成長度分別為13的兩根繩子,或者剪成兩根長度為2的繩子。注意到2×2 > 1×3,同時2×2 = 4,其實沒必要剪,只是題目的要求是至少要剪一刀。

class

solution

}

面試題14 剪繩子

長度為n的繩子,剪為m段,求最大乘積 思路 第一刀後 f n f i f n i 從下到上計算,4可被分為兩個2段 5可分為乙個2乙個3 int maxproductaftercutting int length int max 0 product 1 1 product 2 2 product 3...

面試題14 剪繩子

面試題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 剪繩子

題目 給你一根長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 x k 1 x x k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。動態規劃 int ma...