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

最长公共子序列

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

c11ef1767dd33e0a47c5f913c03522c7.gif

2dcbca52050958eb91dfb3c7fc16bd7a.gif

235a1f1281377c3fe6b4c6294950b2eb.gif { i1 < i2 < … < ik }的序列。

输入样例

2

asdf

adfsd

123abc

abc123abc

输出样例

3

6

解题思路:

这道题是被称为最长公共子序列的问题(LCS,Longest Common Subsequence)的著名问题。这道题我们是用动态规划的思想来做的。我们先拿第一组测试用例,asdf 与 adfsd 作为例子来看一下这道题的思路。上图!!

j / i

1(a)

2(s)

3(d)

4(f)

1(a)

2(d)

3(f)

4(s)

5(d)

做这种题,我们要用一个二维数组(dp[MAX_N][MAX_N])来存放每一个状态的值。如图所示,横向代表i、纵向代表j,那么,每一个网格的值是怎么来的呢。在这里我们把每一个状态即dp[i][j] 看做 s1 … si 和 t1 … tj 的LCS的长度。由此我们,s1 … s(i+1) 和 t1 … t(j+1) 对应的公共子列长度可能是:

当s(i+1) == t(j+1),在 s1 … si 和 t1 … tj 的公共子列末尾追加上s(i+1) 。

否则则可能是 s1 … si 和 t1 … t(j+1) 的公共子列或者 s1 … s(i+1) 和 t1 … tj 的公共子列最大值。

对应以下一个公式:

703901ce920a648c8b5475b488f1b019.png

最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)_第1张图片

有了上面的公式我们就可以写代码了:

//最长公共子序列

#include

#include

#include

#include

#define MAX 1001

using namespace std;

int dp[MAX][MAX];

int main()

{

int N;

cin >> N;

while(N--)

{

string a,b;

cin >> a >> b;

memset(dp,0,sizeof(dp));

int len_a=a.size(),len_b=b.size();

for(int i=0;i

{

for(int j=0;j

{

if(a.at(i)==b.at(j))

dp[i+1][j+1]=dp[i][j]+1;

else

dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);

}

}

cout << dp[len_a][len_b] << endl;

a.clear();

b.clear();

}

return 0;

}

最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)_第2张图片

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

最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...

算法导论-动态规划(最长公共子序列问题LCS)-C++实现

首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = ,另一个序列Z =

动态规划---最长公共子序列 hdu1159

hdu1159 题目要求两个字符串最长公共子序列, 状态转换方程   f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时 f[i][j]=MAX{f[i-1][j],f[i][j-1] ...

动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

《算法导论》读书笔记之动态规划—最长公共子序列 &; 最长公共子串(LCS)

From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...

动态规划----最长公共子序列(LCS)问题

题目: 求解两个字符串的最长公共子序列.如 AB34C 和 A1BC2   则最长公共子序列为 ABC. 思路分析:可以用dfs深搜,这里使用到了前面没有见到过的双重循环递归.也可以使用动态规划,在建 ...

动态规划———最长公共子序列(LCS)

最长公共子序列+sdutoj2080改编: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/ ...

动态规划——最长公共子序列LCS及模板

摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...

动态规划——最长公共子序列&;&;最长公共子串

最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...

随机推荐

opencv 之 icvCreateHidHaarClassifierCascade 分类器信息初始化函数部分详细代码注释。

请看注释.这个函数,是人脸识别主函数,里面出现过的函数之一,作用是初始化分类器的数据,就是一个xml文件的数据初始化. static CvHidHaarClassifierCascade* icvCr ...

三层架构下的EntityFramework codefirst

好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...

数据库批量修改表名,增加前缀(SQL server)

exec sp_msforeachtable @command1=' declare @o sysname,@n sysname select @o=''?'' ,@n=stuff(@o,1,7,'' ...

【JQ成长笔记】jQuery cookie的使用

jquery cookie挺好用的.简单实在.菜鸟都能用得上..额.文笔不好不好..咳咳.. 先来看看jq.cookie的aip 写入cookie $.cookie("this-cookie ...

模拟jquery底层链式编程

//特点1:快级作用域,程序启动自动执行 //内部的成员变量,外部无法访问(除了var) //简单的函数链式调用 function Dog(){ this.run=function(){ alert( ...

数据库 -->; MySQL存储引擎介绍

MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...

python 向量化

study from : https://www.jianshu.com/p/ad8933dd6407

python3 摘抄

https://www.python.org/downloads/release/python-370/ python3.7.0 win10环境,选:Windows x86-64可执行安装程序. ht ...

vue中引入vux

1.安装相关依赖 cnpm install vux --save cnpm install vux-loader --save-dev cnpm install less less-loader -- ...

你可能感兴趣的:(最长公共子序列动态规划c语言)