給你一根長度為n
的繩子,請把繩子剪成m
段(m
、n
都是整數,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
的繩子上剪一刀,有兩種可能得結果:剪成長度分別為1
和3
的兩根繩子,或者剪成兩根長度為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...