全部最大上升子序列

#全部最大上升子序列
#思路:fir保存前lis前n个数的最长子序列,sec保存前n个数的第二长子序列,则下一次的最长子序列是上一次fir加上lis[i]
def maxup(lis):
    cur=1
    fir=[[lis[0]]]
    sec=[[]]
    n=len(lis)
    while cur<n:
        fir_tmp=[]
        sec_tmp=[]
        tir_tmp=[]
        for i in fir:
            if i[len(i)-1]<=lis[cur]:
                s=i[0:]
                s.append(lis[cur])
                fir_tmp.append(s)
            sec_tmp.append(i)
        for i in sec:
            if  len(i)==0 or i[len(i)-1]<=lis[cur]:
                t=i[0:]
                t.append(lis[cur])
                sec_tmp.append(t)
            tir_tmp.append(i)
        if fir_tmp:
            # print("fir_tmp has element")
            fir=fir_tmp
            sec=sec_tmp
            # print("fir for:", fir, "sec:", sec)
        else:
            # print("fir_tmp no element")
            fir=sec_tmp
            sec=tir_tmp
            # print("fir for:", fir, "sec:", sec)
        cur+=1
    return fir
#测试:
lis="""2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19 22 21 24 23 26 25 28 27 30 29 32 31 34 33 36 35 38 37 40 39 42 41 44 43 46 45 48 47 50 49 52 51 54 53 56 55 58 57 60 59 62 61 64 63 66 65 68 67 70 69 72 71 74 73 76 75 78 77 80 79 82 81 84 83 86 85 88 87 90 89 92 91 94 93 96 95 98 97 100 99"""
x=lis.split(" ")
t1=time.clock()
res=maxup(x)
t2=time.clock()
print(len(res),t2-t1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值