[刷題] 動態規劃合集
阿新 • • 發佈:2018-12-12
題目:
給定一根長度為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.定義狀態方程: 從下而上計算: 先計算 再計算.
def maxproduct(n):
if n < 2:
return 0
if n == 2:
return 1
if n == 3:
return 2
dp = [ 0 for i in range(n+1)]
dp[1] = 1
dp[2] = 2
dp[3] = 3 ❗️注意 這裡dp陣列中儲存的與上面實際的輸出不符合,
因為當長度為1,2,3時,實際上不切的時候最大,但是不符合題目要求.
但是當做遞迴的時候, 至少會切一刀.所以dp陣列中儲存他們原本的長度即可
for i in range(4, n):
maxproduct = 0
for j in range(1,i//2 + 1):⭐️# i//2+1避免重複計算
maxproduct = max(maxproduct, dp[j] * dp[i-j])
dp[i] = maxproduct
return dp[-1]