首先,说明一下子序列的定义……

一个序列A={a1,a2,a3,...,an},从中删除任意若干项,剩余的序列叫A的一个子序列。

很明显(并不明显……),子序列……并不需要元素是连续的……(一开始的时候思维总是以为元素是连续的,好傻啊……)

然后是公共子序列……

如果C是A的子序列,也是B的子序列,那么C是A和B的公共子序列……

公共子序列一般不止一个,最长的那个就是最长公共子序列,当然也可能不止一个……

煮个栗子……

A={1,3,6,9,5,4,8,7},B={1,6,3,4,5,7}

{1,4,7}是A和B的公共子序列

{1,3,4,7}是A和B的最长公共子序列

好了,说明的部分就到这,接下来,进入解决问题的部分……

给出序列A={a1,a2,a3...an},B={b1,b2,b3...bn}

我们用lcs[i][j]来表示A的前i项和B的前j项的最长公共子序列的长度

flag[i][j]表示这一点是由哪点继承来的,然后,开始搜索……

如果……

(1)A[i]==B[j]

那么就代表lcs[i][j]的最后一项一定是A[i],就是在lcs[i-1][j-1]接上A[i],也就是lcs[i][j]=lcs[i-1][j-1]+1,并记录flag[i][j]

(2)A[i]!=B[j]

那么lcs[i][j]=max(lcs[i-1][j-1],lcs[i][j-1]),因为既然接不上,那就继承一个长一点的留着呗,不要忘记了flag[i][j]的数字是不同的亲~

可能我说的比较简略,上一张比较好理解的图……

可能第一次看会很凌乱,仔细看吧亲……

最后按flag打出来就好了~

最后上代码

 #include<stdio.h>
#include<string.h>
int lcs[][];
int flag[][];
char a[],b[];
void findlcs(char a[],char b[],int lena,int lenb){
int i,j;
for(i=;i<=lena;i++)
for(j=;j<=lenb;j++){
if(a[i-]==b[j-]){
lcs[i][j]=lcs[i-][j-]+;
flag[i][j]=;
}
else{
if(lcs[i][j-]>lcs[i-][j]){
lcs[i][j]=lcs[i][j-];
flag[i][j]=;
}
else{
lcs[i][j]=lcs[i-][j];
flag[i][j]=;
}
}
}
}
void printlcs(char a[],char b[],int lena,int lenb){
int i=lena;
int j=lenb;
int len=;
int rec[];
while(i>&&j>){
if(flag[i][j]==){
rec[len++]=a[i-];
i--,j--;
}
else if(flag[i][j]==) j--;
else if(flag[i][j]==) i--;
}
len--;
while(len>=){
printf("%c",rec[len--]);
}
printf("\n");
}
int main(){
while(~scanf("%s%s",a,b)){
int lena=strlen(a);
int lenb=strlen(b);
findlcs(a,b,lena,lenb);
printlcs(a,b,lena,lenb);
memset(flag,,sizeof(flag));
memset(lcs,,sizeof(lcs));
}
return ;
}

经典dp 最长公共子序列的更多相关文章

  1. hdu1159 dp(最长公共子序列)

    题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...

  2. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  3. poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Desc ...

  4. 经典算法-最长公共子序列(LCS)与最长公共子串(DP)

    public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length() ...

  5. HDU 1159 Common Subsequence【dp+最长公共子序列】

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

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

    Common Subsequence A subsequence of a given sequence is the given sequence with some elements (possi ...

  7. hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

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

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

  9. 动态规划经典算法--最长公共子序列 LCS

    转移方程 代码: //法一: #include <bits/stdc++.h> using namespace std; //---------------https://lunatic. ...

随机推荐

  1. NLog在MVC中使用

    NLog在MVC中使用 在site根目录新建NLog.config <?xml version="1.0"?> <configuration> <nl ...

  2. 用SecureCRT连接虚拟机

    1.Root用户进入虚拟机系统 2.打开控制台 3.永久关闭防火墙,打开sshd,这样SecureCRT才能连接 chkconfig iptables off;service sshd start 4 ...

  3. java操作mongodb——连接数据库

    import com.mongodb.MongoClient; MongoClient mongoClient = new MongoClient(); 连接MongoDB实例,默认为localhos ...

  4. jenkins 杀死衍生进程

    解决方法-1: 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins衍生进程 解决方法-2: 修改/etc/sysconfig/jenkins配置,在 ...

  5. CodeForces 675E Trains and Statistic

    贪心,递推,线段树,$RMQ$. 假设我们记$ans[i]$是以$i$点为起点对答案的贡献,那么答案就是$\sum\limits_{i = 1}^n {ans[i]}$. $ans[i]$怎么计算呢? ...

  6. asp.net mvc 上传下载文件的几种方式

    view: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...

  7. 获取listview当前滚动的高度

    public int getScrollY() {      View c = mListView.getChildAt(0);      if (c == null ) {          ret ...

  8. HDU 1517 A Multiplication Game 博弈

    题目大意:从1开始Stan与Ollie经行博弈,stan先手,每次将当前数乘上(2~9)间的任意数,最后一次操作后大于等于n的人获胜. 题目思路: 1-9 stan 胜 10-18 ollie胜 19 ...

  9. ACE Socket Wrapper Facade

    ACE Socket Wrapper Facade 1:Socket API 1.1 IPC(进程间通信) IPC分为本地IPC(同一计算机上的不同进程)和远程IPC(网络互联的不同计算机),本地IP ...

  10. MySQL-Front 出现“程序注册时间到期 程序将被限制模式下运行”解决方式

    MySQL-Front 出现“程序注册时间到期 程序将被限制模式下运行”解决方式 在用mysql-front的时候遇到显示:程序注册时间到期程序将被限制模式下运行.可以在“帮助”菜单下的点“登记”-- ...