Common Subsequence
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 43211   Accepted: 17526

Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming contest
abcd mnp

Sample Output

4
2
0

Source

 
 
 
 
这个题是求最大公共子序列的长度,不是公共子串,他们的区别是::最长公共子串必须是连续的,而最长公共子序列不需要连续!
 
 
注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。
 
 
 
这个题就是个裸的cls
 
 
 
我简单说一下cls的原理
 
 
就是要让任意一个串每次增加一个字符分别和另一个串比较,求出最大的公共部分!
 
 
 
 

LCS(S1,S2)等于下列3项的最大者:

(1)LCS(S1,S2’)--如果C1不等于C2;

(2)LCS(S1’,S2)--如果C1不等于C2;

(3)LCS(S1’,S2’) LCS(S1',S2')+1--如果C1等于C2;

边界终止条件:如果S1和S2都是空串,则结果也是空串。

 
 
看张图好理解
 
 
 
 
先让A自己是一个串,和串BDCABA一个一个比
 
第一次比较 A和B他们都是一个串,末尾A和B不相等,最长的公共部分就是A前面串(空)和B或者B前面串(空)和A的最大一个,显然他们前面都没有,就是0
 
 
 
第二次比较A和 BD,末尾A和D不相等,最长的公共部分就是A前面串(空)和BD或者D前面串(B)和A的最大一个,显然他们公共部分为0
 
 
 
第三次比较A和BDC,末尾A和C不相等,最长的公共部分就是A前面串(空)和BDC或者C前面串(BD)和A的最大一个,显然他们公共部分为0
 
 
 
第四次比较A和BDCA,末尾A和A相等,最长的公共部分就是A前面串(空)和A前面串(BDC)公共长度加1(因为最后一个相等都是A)显然他们公共部分为1
....
 
 
 
依次写到末尾就是最长的公共部分的最大长度
 
 
 
 
套用模板:
 
 
 
 
 
 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[],s2[];
int dp[][];
int main()
{
int i,j;
while(scanf("%s%s",s1,s2)!=EOF)
{
memset(dp,,sizeof(dp));
int len1=strlen(s1);
int len2=strlen(s2);
for(i=;i<=len1;i++)//i和j从1开始整体右下移一位,避开串钱为空的情况
{
for(j=;j<=len2;j++)
{
if(s1[i-]==s2[j-])
dp[i][j]=dp[i-][j-]+;
else
dp[i][j]=max(dp[i][j-],dp[i-][j]);
}
}
printf("%d\n",dp[len1][len2]);
}
return ;
}
这是个模板记住就行,欢迎各位留言询问!

Common Subsequence--poj1458(最长公共子序列)的更多相关文章

  1. hdu 1159 Common Subsequence(LCS最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  2. hdu 1159 Common Subsequence (最长公共子序列 +代码)

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  3. hdu 1159 Common Subsequence(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  4. 题解报告:hdu 1159 Common Subsequence(最长公共子序列LCS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description 给定序列的子序列是给定的序列,其中有一些元素(可能没有) ...

  5. POJ 1458 Common Subsequence 【最长公共子序列】

    解题思路:先注意到序列和串的区别,序列不需要连续,而串是需要连续的,先由样例abcfbc         abfcab画一个表格分析,用dp[i][j]储存当比较到s1[i],s2[j]时最长公共子序 ...

  6. POJ 1458 Common Subsequence(最长公共子序列)

    题目链接Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: Description A subsequence o ...

  7. HDU 1159 Common Subsequence 【最长公共子序列】模板题

    题目链接:https://vjudge.net/contest/124428#problem/A 题目大意:给出两个字符串,求其最长公共子序列的长度. 最长公共子序列算法详解:https://blog ...

  8. hdu 1159 Common Subsequence(最长公共子序列,DP)

    题意: 两个字符串,判断最长公共子序列的长度. 思路: 直接看代码,,注意边界处理 代码: char s1[505], s2[505]; int dp[505][505]; int main(){ w ...

  9. POJ1458 Common Subsequence 【最长公共子序列】

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37614   Accepted: 15 ...

  10. POJ1458 Common Subsequence —— DP 最长公共子序列(LCS)

    题目链接:http://poj.org/problem?id=1458 Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Tot ...

随机推荐

  1. SolrCloud初识

    文章摘自:http://www.bubuko.com/infodetail-923588.html 一.概述 Lucene是一个Java语言编写的利用倒排原理实现的文本检索类库: Solr是以Luce ...

  2. 基于htmlparser实现网页内容解析

    基于htmlparser实现网页内容解析 网页解析,即程序自动分析网页内容.获取信息,从而进一步处理信息. 网页解析是实现网络爬虫中不可缺少而且十分重要的一环,由于本人经验也很有限,我仅就我们团队开发 ...

  3. (转) 如何命令查找linux系统版本!

    一.查看内核版本命令: 1) [root@SOR_SYS ~]# cat /proc/versionLinux version 2.6.18-238.el5 (mockbuild@x86-012.bu ...

  4. KEIL中的变量相关

    例:sfr P0=0x80表示P0口地址为80H:(sfr是字节操作) sfr16 T2=0xCC表示T2口地址的低地址为TL2=0XCC,高地址为TH2=0XCD(sfr16是字操作) 头文件reg ...

  5. logstash 利用drop 丢弃过滤日志

    input { stdin { } } filter { grok { match => ["message","\s*%{TIMESTAMP_ISO8601}\s ...

  6. html--鼠标控制DIV移动

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. Linux编程环境介绍(1) -- linux的历史

    1. linux是什么? "Hello everybody out there using minix——I'm doing a (free) operating system"  ...

  8. 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结

    1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象    ...

  9. 用SNMP协议实现系统信息监控--CentOS

    (1)  安装SNMP客户端以及服务端 安装内容为三项:net-snmp  net-snmp-devel   net-snmp-utils 安装命令:yum install net-snmp net- ...

  10. DEV GridControl 鼠标单击事件

    private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { ...