这个问题经常运用在判断两种生物的相似度—-DNA比对上。对比俩串的方式有很多种,例如如果一个串是另一个的字串,那么可以说两个串是相似的:如果将一个串转换为另一个串的操作很少,那么也可以说这两个串是相似的。另一种衡量俩串S1,S2S1,S2的相似度方式为:寻找第3个串S3S3,它的所有元素也都出现在S1S1和S2S2中,且在三个串中出现的顺序都相同,但在S1,S2S1,S2中不要求连续出现。我们将最后一种相似的概念描命名最长公共子序列问题。

其形式化定义如下:给定一个序列X=⟨x1,x2…,xm⟩X=⟨x1,x2…,xm⟩,另一个序列Y=⟨y1,y2,…,yk⟩Y=⟨y1,y2,…,yk⟩满足如下条件时成为XX的子序列(sunsequence),即存在一严格递增的XX的下标序列⟨i1,i2,…,ik⟩⟨i1,i2,…,ik⟩,对所有j=1,2,…,kj=1,2,…,k满足ij=zjij=zj。例如,Z=⟨B,C,D,B⟩Z=⟨B,C,D,B⟩是X=⟨A,B,C,B,D,A,B⟩X=⟨A,B,C,B,D,A,B⟩的子序列,对应的下标为⟨2,3,5,7⟩⟨2,3,5,7⟩。

给定一个序列X=⟨x1,x2…,xm⟩X=⟨x1,x2…,xm⟩,对i=1,2,…,ki=1,2,…,k,定义XX的第ii前缀为Xi=⟨x1,x2…,xi⟩Xi=⟨x1,x2…,xi⟩。

刻画最长公共子序列的特征

LCSLCS的最优子结构:令X=⟨x1,x2…,xm⟩X=⟨x1,x2…,xm⟩和Y=⟨y1,y2,…,yn⟩Y=⟨y1,y2,…,yn⟩为两个序列,Z=⟨z1,z2,…,zk⟩Z=⟨z1,z2,…,zk⟩为XX和YY的任意LCSLCS。

1.如果xm=ynxm=yn,则zk=xm=ynzk=xm=yn且Zk−1Zk−1是Xm−1Xm−1和Yn−1Yn−1的一个LCSLCS。

2.如果xm≠ynxm≠yn,则zk≠xmzk≠xm且ZZ是Xm−1Xm−1和YY的一个LCSLCS。

3.如果xm≠ynxm≠yn,则zk≠ynzk≠yn且ZZ是XX和Yn−1Yn−1的一个LCSLCS。

一个递归解

我们定义c[i,j]c[i,j]表示XiXi和YjYj的LCSLCS的长度。则根据LCSLCS问题的最优子结构性质,可得如下公式:

c[i,j]=⎧⎩⎨⎪⎪0c[i−1,j−1]+1max(c[i,j−1],c[i−1,j])if i=0 or j=0if i,j>0 and xi=yjif i,j>0 and xi≠ yj

c[i,j]={0if i=0 or j=0c[i−1,j−1]+1if i,j>0 and xi=yjmax(c[i,j−1],c[i−1,j])if i,j>0 and xi≠ yj

源代码

#include #include #include #include using namespace std;

//ACCGTCGAGTGCGCGGAAGCCGGCCGAA & CTCGTTCGGAATGCCGTTGCTCTGTAAA

string temp_strX = { "#ACCGTCGAGTGCGCGGAAGCCGGCCGAA" }, temp_strY = { "#CTCGTTCGGAATGCCGTTGCTCTGTAAA" };

//Memoized of Lcs

pair>,vector>> Lcs_Length(const string &temp_strX, const string &strY) {

auto temp_m = temp_strX.size() - 1, temp_n = temp_strY.size() - 1;

vector> temp_VecB, temp_VecC;

temp_VecB.resize(temp_m + 1);

temp_VecC.resize(temp_m + 1);

for(auto &i : temp_VecB) {

i.resize(temp_n + 1);

}

for(auto &i : temp_VecC) {

i.resize(temp_n + 1);

}

for(auto i = 1; i <= temp_m; ++i) {

temp_VecC[i][0] = 0;

}

for(auto j = 0; j <= temp_n; ++j) {

temp_VecC[0][j] = 0;

}

for(auto i = 1; i <= temp_m; ++i) {

for(auto j = 1; j <= temp_n; ++j) {

if(temp_strX[i] == temp_strY[j]) {

temp_VecC[i][j] = temp_VecC[i - 1][j - 1] + 1;

temp_VecB[i][j] = -1;

}

else if(temp_VecC[i - 1][j] >= temp_VecC[i][j - 1]) {

temp_VecC[i][j] = temp_VecC[i - 1][j];

temp_VecB[i][j] = -2;

}

else {

temp_VecC[i][j] = temp_VecC[i][j - 1];

temp_VecB[i][j] = -3;

}

}

}

return make_pair(temp_VecC, temp_VecB);

}

//Print

void Print_Lcs(const vector> & temp_VecB, const string &temp_strX, const size_t &i, const size_t &j) {

if(i == 0 || j == 0) {

return;

}

if(temp_VecB[i][j] == -1) {

Print_Lcs(temp_VecB, temp_strX, i - 1, j - 1);

cout << temp_strX[i];

}

else if(temp_VecB[i][j] == -2) {

Print_Lcs(temp_VecB, temp_strX, i - 1, j);

}

else {

Print_Lcs(temp_VecB, temp_strX, i, j - 1);

}

}

int main() {

auto temp_pair = Lcs_Length(temp_strX, temp_strY);

Print_Lcs(temp_pair.second, temp_strX, temp_strX.size() - 1, temp_strY.size() - 1);

return 0;

}

0.0分

0 人评分

用动态规划解决最长公共子序列问题 C语言,动态规划之最长公共子序列问题 C++实现...相关推荐

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

    要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...

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

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

  3. 最长公共子序列 - 北京大学郭炜 动态规划代码详解

    最长公共子序列 - 北京大学郭炜 动态规划代码详解 解题思路: 该题可用动态规划解决.动态规划需要我们找出子问题. 假设我们输入两个字符串: ACTTGACC CGTT 那么如何通过动态规划算出其最大 ...

  4. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  5. LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)

    1.摘要: 关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几 ...

  6. c语言动态规划公共字符串,最长公共子串 C语言 动态规划

    给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何 ...

  7. c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...

    十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...

  8. 十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神!

    @Author:Runsen @Date:2020/10/12 十月过得很平缓.在这个"收获的季节",我成了为数不多不必收获的人.每天睡到中午,即使闹钟设在早上也很难把自己弄醒. ...

  9. 蓝桥杯 蓝肽子序列 python(2020动态规划)

    蓝桥杯 蓝肽子序列 python(2020动态规划) 题目描述 L 星球上的生物由蛋蓝质组成,每一种蛋蓝质由一类称为蓝肽的物资首尾连接成一条长链后折叠而成. 生物学家小乔正在研究 L 星球上的蛋蓝质. ...

最新文章

  1. Firebug高级用法 - Web开发的利器
  2. linux命令查询邮件发送状态,Linux发邮件之mail命令详解
  3. python 3.5.2设计页面_怎么解决win10系统搭建Python 3.5.2开发环境的处理方案
  4. (转ORCLE导入导出命令)
  5. 匪夷所思:罕见的 Oracle 全局事务锁等待事件分析
  6. 【TI-ONE系列教程(三)】如何使用 TI-ONE 平台内置框架玩转算法大赛
  7. HTML5 -canvas拖拽、移动 绘制图片可操作移动,拖动
  8. android可以root的版本,Android8.0以上系统ROOT时,Magisk框架替代SpuerSU
  9. mesh和wifi中继的区别_科普:路由器的无线中继和Mesh的区别是什么?
  10. 计算机找不到硬盘分区,电脑硬盘分区不见了怎么办
  11. 谷歌分析数据导入4种方式
  12. Pytorch节省显存、加速训练的小技巧
  13. 肾囊肿有什么症状呢?
  14. emlog模板酷黑自适应CoolBlack主题 黑的有质感
  15. 苹果客户端支付后,服务器端对数据进行二次验证接口开发
  16. 裸女街上走秀一小时 路人疯狂拍照无人制止
  17. 汉字 字库压缩ttf
  18. 台式计算机如何判断电源损坏,台式电脑电源坏了的表现有哪些
  19. 马氏距离例题详解(全网最详细)
  20. 06数据分析 - 预测性分析

热门文章

  1. mysql数据库计算两列数据的和_在sql中对两列数据进行运算作为新的列操作
  2. 动图处理_100+动图带你看懂百大加工工艺(成型、表面处理、链接、切割)
  3. 停止运行_锅炉停止运行应注意哪些事项?
  4. 2007年8月25日华为的几个面试题
  5. 虚拟机centos7.3不能启动
  6. 【BZOJ4289】Tax,堆优化dijsktra的最短路问题
  7. 仿链家地图找房_我在深圳的第一个家 是在有着6000套房的工业区里
  8. springsecurity文档_今天学了springsecurity
  9. css 字体倾斜_css笔记3(文本,列表,背景声明)
  10. 由浅入深了解Thrift(二)——Thrift工作原理