最长公共子序列
来源:互联网 发布:自动化编程自学 编辑:程序博客网 时间:2024/06/05 17:40
描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:
Xij = Zj
如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度。
Xij = Zj
如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度。
输入
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
输出
一个整数,表示最长各个子序列的长度。
格式:printf("%d\n");
格式:printf("%d\n");
输入样例
programming
contest
contest
输出样例
2
#include <iostream>#include <algorithm>#include <cstring>using namespace std;char s1[210];char s2[210];int c[210][210]; //c[i][j]表示s1[1,i]和s2[1,j]的LCSint b[210][210]; //记录路径void LCS(int m, int n){ for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(s1[i-1] == s2[j-1]) //i,j从0开始 { c[i][j] = c[i-1][j-1]+1;//从对角 b[i][j] = 0; } else if(c[i-1][j] > c[i][j-1]) { c[i][j] = c[i-1][j]; //从上方 b[i][j] = 1; } else { c[i][j] = c[i][j-1]; //从左边 b[i][j] = -1; } } }}void Print(int i, int j){ if(i == 0 || j == 0) return; if(b[i][j] == 0) { Print(i-1, j-1); cout << s1[i-1] << endl; } else if(b[i][j] == 1) Print(i-1, j); else Print(i, j-1);}int main(){ while(cin >> s1 >> s2) { memset(c, 0, sizeof(c)); memset(b, 0, sizeof(b)); int m = strlen(s1); int n = strlen(s2); LCS(m, n); //Print(m, n); cout << c[m][n] << endl; }}
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- Session和cookie详解和区别perfect
- Listview中嵌套ImageView,ImageView高度自适应时,显示不占满布局有空白,解决方案
- css sprite 图片整合处理技术(精灵技术)
- Dos下的edit命令
- 汉诺塔问题
- 最长公共子序列
- json使用总结
- ActiveX(MFC)控件——添加接口及WEB调用
- oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)
- 细说exports和module.exports
- CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
- Android 5.0 Notification的改变
- struts1 action 之间的跳转
- JDK容器与并发—Map—TreeMap