[刷题] 动态规划合集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/programmingfool5/article/details/82851442

题目:

给定一根长度为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 ( n i ) ) ,   i < = n / / 2 f(n) =\max (f(i)\times f(n-i)),\ i<=n//2 f ( 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]
			

猜你喜欢

转载自blog.csdn.net/programmingfool5/article/details/82851442