最长公共子序列问题
一种相似度的概念;一个给定的序列的子序列是将序列中零个或多个元素去掉之后得到的结果。
定义:给定一个序列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);}}
}

转载于:https://www.cnblogs.com/james1207/p/3325007.html

动态规划(四)--最长公共子序列相关推荐

  1. c语言最长公共子序列_序列比对(二十四)——最长公共子序列

    原创: hxj7 本文介绍如何求解两个字符串的最长公共子序列. 最长公共子序列问题 前文<序列比对(二十三)--最长公共子字符串>介绍了如何求解两个字符串的最长公共子字符串,本文将介绍如何 ...

  2. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  3. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  4. javascript写算法(一) 动态规划:最长公共子序列

    csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它...看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了.最近还频频出现的广告是一个光头男子 ...

  5. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  6. 实验二 动态规划算法 最长公共子序列问题

    基本题一:最长公共子序列问题 一.实验目的与要求 1.熟悉最长公共子序列问题的算法: 2.初步掌握动态规划算法: 二.实验题 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,z ...

  7. 动态规划求解最长公共子序列

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  8. 动态规划解决方案最长公共子序列问题(开启)

     动态规划 常常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地採用把大问题分解成子问题.并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数添加. 为 ...

  9. 动态规划之----最长公共子序列

    动态规划算法的基本要素: 1)最优子结构 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质.问题的最优子结构性质提供了该问题可用动态规划算法求解的最重要线索. 在动态规划算法中,利用 ...

  10. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

最新文章

  1. [转帖]C#执行SQL脚本,读取XML文件
  2. rewrite 帮助实现页面静态化
  3. Fedora 30将获得Bash 5.0,淘汰Yum推迟到Fedora 31
  4. java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?
  5. 学完计组后,我马上在「我的世界」造了台显示器,你敢信?
  6. C++语言类的详解和示例
  7. 学习Caffe(一)使用Caffe
  8. 多线程和并发管理 .NET多线程服务
  9. TbSchedule的简单使用及其配置
  10. ImageJ的自动二值算法C++实现
  11. word中插入分割线
  12. 【黑灰产犯罪研究】DDOS攻击
  13. CAN总线隔离器介绍
  14. jquery事件绑定的问题Uncaught TypeError: $(...).live is not a function at HTMLDocument.<anonymous> (ex5_
  15. LeetCode HOT 100 --- 2021/7/30
  16. 父---->曾孙,跨多层组件传值方法provide/inject
  17. 荣耀v10+android+8.1,别在纠结:华为荣耀V10和荣耀10的真正的不同在
  18. jwplayer使用常见问题
  19. 登顶KITTI!Mix-Teaching:适用于单目3D目标检测的半监督方法【清华大学】
  20. 盟军敢死队2 - 3D导航网格浏览器

热门文章

  1. 注解之RetentionPolicy,ElementType
  2. 英特尔:5G将释放云的潜力,为垂直行业带来巨大商机
  3. eclipse 安装egit插件
  4. 深入理解Tomcat系列之一:系统架构(转)
  5. python 下载csv文件保存到 redis
  6. socket与TCP/UDP编程-转
  7. 使用FFMpeg进行H264编码
  8. 超实用的8个Linux命令行性能监测工具
  9. 这一次,让你彻底明白接口及抽象类
  10. 前端知识 — HTML内容、CSS基础