1. 程式人生 > >[刷題] 動態規劃合集

[刷題] 動態規劃合集

題目:

給定一根長度為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.定義狀態方程: f(n)=max(f(i)×f(ni)),i<=n//2f(n) =\max (f(i)\times f(n-i)),\ i<=n//2f(n)n,

. f(n)代表繩子長度為n時, 所獲得最大乘積. 從下而上計算: 先計算f(2)f(3)f(2) f(3) 再計算f(4)...f(n)f(4)...f(n).

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]