NO——47:最长递增子序列

来源:互联网 发布:新难兄难弟知乎 编辑:程序博客网 时间:2024/05/18 01:27

题目:

求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}

2.参考博客:
http://www.cnblogs.com/whyandinside/archive/2012/09/15/2686498.html

前三种方法我都没有看懂。。。。

最后我采用的是第4种。
代码如下:

def getmaxsameli(li1,li2):    len1=len(li1)    len2=len(li2)    maxtrix=[ [(0,(0,0))]*(len2+1) for row in xrange(len1+1)]    maxtrix[0]=[ (0,(0,-1)) for col in xrange(len2+1)]    for row in xrange(len1+1):        maxtrix[row][0]=(0,(-1,0))    for i,value1 in enumerate(li1):        for j ,value2 in enumerate(li2):            if li1[i]==li2[j]:                maxtrix[i+1][j+1]=(maxtrix[i][j][0]+1,(-1,-1))            else:                maxtrix[i+1][j+1]=maxtrix[i][j+1][0],(-1,0)                if maxtrix[i+1][j][0]>maxtrix[i+1][j+1][0]:                    maxtrix[i+1][j+1]=maxtrix[i+1][j][0],(0,-1)    for row in xrange(len1):        for col in xrange(len2):            print "(%s,%s),%s"%(li1[row],li2[col],maxtrix[row+1][col+1]),        print    row,col=len1,len2    re_list=[]    while row>0 and col>0:        tmp_num,tmp_dir=maxtrix[row][col]        if tmp_dir==(-1,-1):            if not re_list:                re_list.append(li2[col-1])            else:                re_list.insert(0,li2[col-1])        row,col=row+tmp_dir[0],col+tmp_dir[1]    return re_listif __name__=="__main__":    souce_li=[9 ,8, 2, 1,12,11,10,100, 7, 5, 3, 4, 3, 2, 1]    sorted_li=list(set(souce_li))    sorted_li=sorted(sorted_li,reverse=True)    #sorted_li=list()    print getmaxsameli(souce_li,sorted_li)
动态规划,还是不熟啊。。以后有时间专门抽个时间来做次动态的习题吧。

0 0