Python动态规划—最长不降子序列

sd最长不下降子序列: 子序列有很多,求出最长不下降子序列的意思是要求出一个子序列,它是不下降的,并且它在所有不下降的子序列中元素最多,这个最长不下降子序列可能有多个。

实验代码及结果

 

 

源代码:

#author_=王晨刚
#data;2020/4/13
def LAS(a):
    n = len(a) #表c存放公共子序列的长度,b存放后续的位置,长度为n
    c = [0 for i in range(n)]  #n个0
    b = [-1 for i in range(n)] #n个-1
    c[n-1] = 1  #最后一个字符的LAS长度
    for i in range(n-1,-1,-1): #倒序从n-1 到0
        maxj = 0
        for j in range(i+1,n): #j=i+1~n-1
            if a[i] < a[j] and c[j] > c[maxj]:
                maxj = j #刷新maxj
                b[i] = maxj #记录i的后继
                #取得从c[i]的长度
                c[i] = c[maxj] + 1
    return c,b
A =[3,18,7,14,10,12,23,41,16,24]
c,b=LAS(A)
print(c)
print(b)

res=[]
def printLAS(b,A,i):
    res.append(A[i])
    while b[i]>0:
        i=b[i]
        res.append(A[i])
    print(res)
printLAS(b,A,0)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值