动态规划(四)--最长公共子序列

来源:互联网 发布:coc防空火箭数据2016 编辑:程序博客网 时间:2024/05/11 00:12
最长公共子序列问题
一种相似度的概念;一个给定的序列的子序列是将序列中零个或多个元素去掉之后得到的结果。
定义:给定一个序列X=<x1,x2,。。。,xm>,另一个序列Z=<z1,z2,...,zk>满足如下条件时称为X
的子序列。即存在一个严格递增的X的下标序列<i1,i2,...,ik>,对所有j=1,2,...,k,满足xij=zj,

问题描述:给定两个序列X=<x1,x2,。。。,xm>和Y=<y1,y2,...,yn>,求X和Y的长度最长的公共子序列。

根据第一篇的理论,
Step 1:刻画最长公共子序列的特征
    LCS的最优子结构
        定理:   
             令X=<x1,x2,。。。,xm>和Y=<y1,y2,...,yn>为两个序列,Z=<z1,z2,...,zk>为X和Y的任意LCS。
            1.若Xm = Yn,则zk = xm=yn且Zk-1是Xm-1和Yn-1的一个LCS。
            2.若Xm不等于Yn,那么Zk不等于Xm,意味着Z是Xm-1和Y的一个LCS。
            3.若Xm不等于Yn,那么Zk不等于Xm,意味着Z是Xm和Y的一个LCS。
    上述定力告诉我们,两个序列的LCS包含两个序列的前缀的LCS,因此LCS问题具有最优子结构。

Step 2 : 一个递归解
在求解X=<x1,x2,。。。,xm>和Y=<y1,y2,...,yn>的一个LCS时,我们需要求解一个或两个子问题,如果Xm=Yn,我们应该求解Xm-1和Yn-1的一个LCS。将Xm=Yn追加到这个LCS的末尾,就得到X和Y的一个LCS。若Xm不等于Yn,我们必须求解两个子问题:求Xm-1和Y的一个LCS与X和Yn-1的一个LCS;两个LCS较长者即为X和Y的一个LCS。
定义c[i][j]表示Xi和Yj的LCS的长度可得以下公式
                                      {  0                                         若i=0或j=0
                        c[i][j] =  {c[i-1][j-1] + 1                       若i,j>0且Xi=Yj
                                      {max(c[i][j-1],c[i-1][j])           若i,j>0且xi≠Yj
Step 3:计算LCS的长度及构造LCS
自底向上方法,先生成一张表,再根据表中元素所指的方向迭代出最长子序列
/** * @author BiangHoo * * 2013年9月11日 */public class LCS {public static void main(String[] args) {String X[] = {"A","B","C","B","D","A","B"};String Y[] = {"B","D","C","A","B","A"};LCS_Length(X,Y);}static void display(String array[][]){for(int i=0;i<array.length;i++){for(int j=0;j<array[0].length;j++){System.out.print(array[i][j]+" ");}System.out.print("\n");}System.out.print("\n"+"the LCS is: ");}static void LCS_Length(String X[],String Y[]){int xlen = X.length;int ylen = Y.length;String b[][] = new String[xlen+1][ylen+1];int c[][] = new int[xlen+1][ylen+1];for(int i=0;i<xlen+1;i++){c[i][0] = 0;}for(int i=0;i<ylen+1;i++){c[0][i] = 0;}for(int i=1;i<xlen+1;i++){//bottom to topfor(int j=1;j<ylen+1;j++){if(X[i-1]==Y[j-1]){c[i][j] = c[i-1][j-1]+1;b[i][j] ="arrow";}else if(c[i-1][j] >= c[i][j-1]){c[i][j] = c[i-1][j];b[i][j] = "up";}else{c[i][j] = c[i][j-1];b[i][j] = "left";}}}display(b);Print_LCS(b,X,xlen,ylen);}static void Print_LCS(String [][] b,String[]X,int i,int j){if(b[i][j] == null){return ;}if(b[i][j] == "arrow"){Print_LCS(b,X,i-1,j-1);System.out.print(X[i-1]+" ");}else if(b[i][j] == "up"){Print_LCS(b,X,i-1,j);}else{Print_LCS(b,X,i,j-1);}}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝不愿意吃母乳怎么办 婴儿不肯喝奶粉怎么办 一岁半宝宝不嚼怎么办 饿但是没有食欲怎么办 小孩写不好字怎么办 大人食欲不好怎么办呢? 二周宝宝便秘怎么办 孩子发烧不吃药怎么办 3岁宝宝不喝药怎么办 婆婆老师说孩子怎么办 初生婴儿不吃药怎么办 讨厌婆婆带孩子怎么办 孩子写字手没劲怎么办 孩子一口药不吃怎么办 小孩不爱喝药怎么办 小孩恶心想吐怎么办 孩子和婆婆不好怎么办 孩子吃东西不消化吐怎么办 小孩吃东西吐了怎么办 儿童吃饭容易吐怎么办 宝宝吃饭会吐怎么办 小孩咳嗽还呕吐怎么办 咳嗽严重到呕吐怎么办 幼儿园中班不会写字怎么办 胃难受吐了怎么办 小孩不肯学写字怎么办 孩子不爱穿内裤怎么办 孩子长期不吃肉怎么办 小孩子不吃肉怎么办呢? 一年级小孩写字慢怎么办 听障碍放弃了怎么办 宝宝开始写字该怎么办 恢复的文档乱码怎么办 小孩做作业磨蹭怎么办 宝宝用左手写字怎么办 小孩动作太慢怎么办 幼儿园不去上学怎么办 嫌弃婆婆带孩子怎么办 孩子写字特别慢怎么办 幼儿园孩子不愿写字怎么办 孩子不愿用力写字怎么办