版权声明:本文为博主原创文章,未经博主允许不得转载。 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.定义状态方程:
从下而上计算: 先计算
再计算
.
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]