難度:中等
給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]…k[m-1] 。請問 k[0示例1:]∗k[
1]∗.
..∗k
[m−1
]k[0]*k[1]*...*k[m-1]
k[0]∗k
[1]∗
...∗
k[m−
1]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
輸入: 2示例2:輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
輸入: 10解題思路:輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
求最值,一般都是利用動態規劃的思想:
假設dp[i]是長度為i的繩子劃分後的最大乘積,而j是其中乙個劃分長度,則
d p[
i]=m
ax
dp[i]=max\
dp[i]=
max表示當劃分出j時,剩下的i-j是否繼續劃分,取劃分和不劃分中的最大值。
需要兩次遍歷,一次是繩子總長的遞推遍歷,一次是劃分元素j的遍歷。
python**:
# 動態規劃
class
solution
:def
cuttingrope
(self, n:
int)
->
int:
dp =[0
for _ in
range
(n+1)]
dp[1]
=1for i in
range(2
, n+1)
:for j in
range(1
, i)
: dp[i]
=max
(dp[i]
, dp[i-j]
*j,(i-j)
*j)return dp[n]
複雜度分析: 劍指 Offer 14 I 剪繩子
問題 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。示例...
劍指 Offer 14 I 剪繩子
劍指 offer 14 i.剪繩子 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,...
劍指 Offer 14 I 剪繩子
一 數學推導法 經過一系列推導發現每一段長度為3時,乘積最大。時間複雜度 o 1 空間複雜度 o 1 class solution 二 貪心演算法本質上和數學推導相同,當剩餘長度大於5時每段都切成3,當切到4時,4的最優解是2 2即不切n小於4 返回n 1 n等於4 返回4 n大於4時 繼續切割成長...