首页 > 其他 > 详细

Chapter 15.1 动态规划—钢条切割

时间:2019-06-29 20:01:34      阅读:81      评论:0      收藏:0      [点我收藏+]
# 切钢管
#自顶向下递归实现(指数级时间复杂度)
def cutRod1(p,n):
    if n==0:
        return 0
    q=-99999
    for i in range(1,n+1):
        q=max(q,p[i-1]+cutRod1(p,n-i))
    return q

#动态规划法时间复杂度为O(n²)
#带备忘的自顶向下
def memorizedCutRod(p,n):
    r=[]
    for i in range(n+1):
        r.append(-9999)
    return memorizedCutRodAux(p,n,r)

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

#自底向上
def bottomupCutRod(p,n):
    r = []
    for i in range(n + 1):
        r.append(-9999)
    r[0]=0
    for j in range(1,n+1):
        q=-9999
        for i in range(1,j+1):
            q=max(q,p[i-1]+r[j-i])
        r[j]=q
    return r[n]

重构解
def extendedBottomUpCutRod(p,n):
    r=[]
    s=[]
    for i in range(n+1):
        r.append(-9999)
    for i in range(n+1):
        s.append(-9999)
    for j in range(1,n+1):
        q=-9999
        for i in range(1,j+1):
            if q<p[i-1]+r[j-i]:
                q=p[i-1]+r[j-i]
                s[j]=i
            r[j]=q
    return r,s

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

if __name__=="__main__":
    p=[1,5,8,9,10,17,17,20,24,30]
    print(printCutRodSolution(p,9))

 

Chapter 15.1 动态规划—钢条切割

原文:https://www.cnblogs.com/ldadaqiong/p/11107538.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!