最长公共子序列
来源:互联网 发布:文章类网站源码 编辑:程序博客网 时间:2024/06/06 00:26
最长公共子序列
时限:1000ms 内存限制:200000K 总时限:3000ms
描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列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; } } }}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); cout << c[m][n] << endl; }}
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 解决Hibernate4连接MySQL5.5数据库无法自动创建表的问题
- ZooKeeper典型应用场景一览
- Mybatis 通用Crud-设计思路
- uboot启动流程详解(2)-reset
- JavaWeb日记——JedisPoolConfig详解
- 最长公共子序列
- 基于Go实现的分布式MQ
- 解决Hibernate4连接MySQL5.5数据库无法自动创建表的问题
- HDU 1575 Tr A (矩阵乘法)
- 源码解析--activity启动过程
- Object类--toString方法
- 一个简易的Java爬虫程序
- 防卫导弹
- 深入理解Android消息处理系统——Looper、Handler、Thread