经典算法实现(最长公共子序列,最长递增子序列)

(持续更新,欢迎交流)

1、最长公共子序列

用动态规划的方法解

#encoding=utf-8
class Solution:
    def lcs(self,arr1,arr2):
        len1=len(arr1)
        len2=len(arr2)
        bp1=[[0 for i in range(len2+1)]for j in range(len1+1)]#存路径
        bp=[[0 for i in range(len2+1)]for j in range(len1+1)]#存动态规划的最大值
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                if arr1[i-1]==arr2[j-1]:
                    bp[i][j]=bp[i-1][j-1]+1
                    bp1[i][j]='ok'
                elif bp[i][j-1]>bp[i-1][j]:
                    bp[i][j]=bp[i][j-1]
                    bp1[i][j]='left'
                else:
                    bp[i][j]=bp[i-1][j]
                    bp1[i][j]='up'
        return bp,bp1
    def main(self):
        a='ABCBDAB'  
        b='BDCABA'
        arr1=list(a)
        arr2=list(b)
        bp,bp1=self.lcs(arr1,arr2)
        res=[]
        len1=len(arr1)
        len2=len(arr2)
        while(len1!=0 and len2!=0):
            if bp1[len1][len2]=='ok':
                res.append(len1)
                len1-=1
                len2-=1
            elif bp1[len1][len2]=='left':
                len1-=1
            elif bp1[len1][len2]=='up':
                len2-=1
        res=res[::-1]
        for item in res:
            print arr1[item-1]
s=Solution()
s.main()




2、最长递增子序列

对于子序列[1,5,8,2,3,4]的递增子序列[1,2,3,4]。

该问题可以转化为求[1,5,8,2,3,4]和[,1,2,3,4,5,8]的最长公共子序列问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值