时间复杂度O(m*n)

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f
#define maxn 10000+10
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
while(cin>>a>>b){
int la=strlen(a);
int lb=strlen(b);
for(int i=;i<la;i++)dp[i][]=;
for(int j=;j<lb;j++)dp[][j]=;
//cle(dp)
for(int i=;i<=la;i++)
for(int j=;j<=lb;j++){
if(a[i-]==b[j-])dp[i][j]=dp[i-][j-]+;
else dp[i][j]=max(dp[i-][j],dp[i][j-]);
}
printf("%d\n",dp[la][lb]);
}
return ;
}

如果要输出最长公共子序列,可以添加flag[][]数组,进行转移方向的记录,逆推。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f
#define maxn 500+10
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int flag[maxn][maxn];
char lcs[maxn];
int main()
{
while(cin>>a>>b){
int la=strlen(a);
int lb=strlen(b);
for(int i=;i<la;i++)dp[i][]=;
for(int j=;j<lb;j++)dp[][j]=;
//cle(dp)
for(int i=;i<=la;i++)
for(int j=;j<=lb;j++){
if(a[i-]==b[j-]){
dp[i][j]=dp[i-][j-]+;
flag[i][j]=;//向右下转移
}
else{
if(dp[i-][j]>dp[i][j-]){
flag[i][j]=;//向下转移
dp[i][j]=dp[i-][j];
}
else{
flag[i][j]=;//向右转移
dp[i][j]=dp[i][j-];
}
}
}
int i=la,j=lb;
int k=;
while(i>&&j>){
if(flag[i][j]==){
lcs[k]=a[i-];
k++,i--,j--;
}
else if(flag[i][j]==)i--;
else if(flag[i][j]==)j--;
}
printf("%d\n",dp[la][lb]);
for(int i=k-;i>=;i--)
printf("%c",lcs[i]);
}
return ;
}

LCS模板的更多相关文章

  1. LCS模板,求长度,并记录子串

    //LCS模板,求长度,并记录子串  //亦可使用注释掉的那些代码,但所用空间会变大 #include<iostream> #include<cstring> #include ...

  2. HDU 1159:Common Subsequence(LCS模板)

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

  3. hdu1159 LCS模板题

    题目分析 pid=1159">原题地址 最简单的最长公共子序列(LCS)问题的模板题了.不解释. ------------------------------------------- ...

  4. nyoj 36 最长公共子序列【LCS模板】

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  5. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  6. 模板singleton模式的C++实现

    模板singleton模式的C++实现 近期回过头整理了一下singleton模式,看了别人写的关于singleton的介绍.发现这个singleton模式虽然简单,但要写一个稳定/线程安全/泛型的模 ...

  7. HDU 1159 Common Subsequence:LCS(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意: 求最长公共子序列. 题解: (LCS模板题) 表示状态: dp[i][j] = max ...

  8. nyoj 37-回文字符串(reverse, 动态规划, lcs)

    37-回文字符串 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:17 题目描述: 所谓回文字符串,就是一个字符串,从左到右读和从 ...

  9. P1435 回文字串(LCS问题)

    题目背景 IOI2000第一题 题目描述(题目链接:https://www.luogu.org/problem/P1435) 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成 ...

随机推荐

  1. 线程池的使用。好文。mark【http://blog.csdn.net/rwecho/article/details/21157289】

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  2. PHP中的验证码类(准备篇)

    <!--code.php内容--> <?php //开启session session_start(); include "vcode.class.php"; / ...

  3. Centos 安装Python3的方法

    由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_centos Python-3.6.2]# ...

  4. uva 11798 相对运动的最小最大距离

    C Dog Distance Input Standard Input Output Standard Output Two dogs, Ranga and Banga, are running ra ...

  5. Python入门--5--列表

    python没有数组 蛋是有列表 列表里面可以有:整数,浮点数,字符串,对象 没有数组,没有数组,没有数组,不重要的也说三遍!! 一.创建列表 x = ['abc','sas','www']     ...

  6. 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)

    基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...

  7. react 起手式

    http://blog.csdn.net/zhouzhiande/article/details/52349344 http://blog.csdn.net/zhouzhiande/article/d ...

  8. 【postgresql】postgresql中的between and以及日期的使用

    在postgresql中的between and操作符作用类似于,是包含边界的 a BETWEEN x AND y 等效于 a >= x AND a <= y 在postgresql中比较 ...

  9. 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

    十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; in ...

  10. LeetCode——Remove Nth Node From End of List

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...