动态规划 - 切钢条 (python)

博主在读《算法导论》时,看到了切钢条的自底向上的伪代码,就分享给大家

BOTTOM-UP-CUT-ROD(p,n)
1.  let r[0..n]be a new array
2.  r[0] = 0
3.  for j = 1 to n
4. 		q = 负无穷
5. 		for i = 1 to j
6. 			q = max(q, p[i]+r[j-i])
7. 		r[j] = q
8. 	return r[n]

然后,博主就根据这个伪代码来用python实现

def cutRodDP(p, n):
    r = [0]*(n+1)
    r[0] = 0
    for j in range(1,n+1):
        q = float('-inf')
        for i in range(1,j+1):
            q = max(q, p[i]+r[j-i])
        r[j] = q
    return r[n]

p = [0,1,5,8,9,10,17,17,20,24,30]
n = 3
print(cutRodDP(p,n))  # 结果是8


同时,在《算法导论》里也看到了自顶向下的伪代码,分享给大家

MEMOIZED-CUT-ROD(p,n)
1. let r[0..n]be a new array
2. for i = 0 to n
3. 		r[i] = 负无穷
4. return MEMOIZED-CUT-ROD-AUX(p,n,r)

MEMOIZED-CUT-ROD-AUX(p,n,r)
5. if r[n] >= 0
6. 		return r[n]
7. if n == 0
8. 		q = 0
9. else q = 负无穷
10.		for i = 1 to n
11.			q = max(q, p[i]+MEMOIZED-CUT-ROD-AUX(p,n-i,r))
12.	r[n]=q
13.	return q 

用python来实现上面的代码

def cutTopDown(p,n):
    r = [0]*(n+1)
    for i in range(0, n+1):
        r[i] = float('-inf')
    return helper(p,n,r)

def helper(p,n,r):
    if r[n] >= 0:
        return r[n]
    q = float('-inf')
    if n == 0:
        q = 0
    else:
        q = float('-inf')
        for i in range(1, n+1):
            q = max(q, p[i] + helper(p, n - i, r))
    r[n] = q
    return q 

p = [0,1,5,8,9,10,17,17,20,24,30]
n = 3
print(cutTopDown(p,n))


获取切割方案。

伪代码:

EXTENDED-BOTTOM-UP-CUT-ROD(p,n)
1.	let r[0..n]ands[0..n]be new arrays
2.	r[0]=0
3.	for j = 1 to n
4.		q = 负无穷
5.		for i = 1 to j
6.			if q < p[i]+r[j-i]
7.				q=p[i]+r[j-i]
8.				s[j]=i
9.		r[j]=q
10.	return r and s

PRINT-CUT-ROD-SOLUTION(p,n)
11.	(r,s)=EXTENDED-BOTTOM-UP-CUT-ROD(p,n)
12.	while n>0
13.		print s[n]
14.		n=n-s[n]		

根据上面的伪代码来实现出来

def extendedBottonUp(p,n):
    r = [0]*(n+1)
    s = [0]*(n+1)
    r[0] = 0
    for j in range(1, n+1):
        q = float('-inf')
        for i in range(1, j+1):
            if q < p[i] + r[j-i]:
                q = p[i]+r[j-i]
                s[j]=i
        r[j] = q
    return r,s 

def printCut(p,n):
    (r,s) = extendedBottonUp(p,n)
    while n > 0:
        print(s[n])
        n = n - s[n]

p = [0,1,5,8,9,10,17,17,20,24,30]
n = 4
printCut(p,n)  # 结果 2,2


看到这就麻烦点个赞或者关注来支持一下!谢谢各位~~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值