递归式:

实例图解:

代码:

 #include<stdio.h>
#include<string.h>
const int N=;
int dp[N][N],f[N][N];
char a[N],b[N],c[N];
void LCS(char *a,char *b,int la,int lb)
{
int i,j;
memset(dp,,sizeof(dp));
for(i=;i<=la;i++)
{
for(j=;j<=lb;j++)
{
if(a[i-]==b[j-])
{
dp[i][j]=dp[i-][j-]+;
f[i][j]=;
}
else if(dp[i-][j]>dp[i][j-])
{
dp[i][j]=dp[i-][j];
f[i][j]=-;
}
else
{
dp[i][j]=dp[i][j-];
f[i][j]=;
}
}
}
}
void dfs(char *s,int i,int j)
{
if(!i||!j) return ;
if(!f[i][j])
{
dfs(s,i-,j-);
printf("%c",s[i-]);
}
if(f[i][j]==)
dfs(s,i,j-);
if(f[i][j]==-)
dfs(s,i-,j);
}
int main()
{
while(scanf("%s%s",a,b)!=EOF)
{
int la=strlen(a),lb=strlen(b);
LCS(a,b,la,lb);
printf("%s和%s的最长公共子序列为:\n",a,b);
dfs(a,la,lb);
puts("");
printf("长度为:%d\n",dp[la][lb]);
}
return ;
}

如果不需要记录路径,可以改成一维数组。

 #include<stdio.h>
#include<string.h>
const int N=;
int dp[N];
char a[N],b[N];
int LCS(char *a,char *b,int la,int lb)
{
int i,j,ma;
memset(dp,,sizeof(dp));
for(i=;i<=la;i++)
{
ma=;
for(j=;j<=lb;j++)
{
if(dp[j]>ma) ma=dp[j];
if(a[i-]==b[j-])
dp[j]=ma+;
}
}
for(i=;i<=lb;i++)
if(dp[i]>ma)
ma=dp[i];
return ma;
}
int main()
{
while(scanf("%s%s",a,b)!=EOF)
{
int la=strlen(a),lb=strlen(b);
printf("长度为:%d\n",LCS(a,b,la,lb));
}
return ;
}

在这个基础上,最长递增(减)子序列(LICS)就可以写了。

 #include<stdio.h>
#include<string.h>
const int N=;
int dp[N];
int LICS(int *a,int *b,int n,int m)
{
int i,j,ma;
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
{
ma=;
for(j=;j<=m;j++)
{
if(a[i]>b[j]&&dp[j]>ma)
ma=dp[j];
if(a[i]==b[j])
dp[j]=ma+;
}
}
for(i=;i<=m;i++)
if(dp[i]>ma)
ma=dp[i];
return ma;
}
int main()
{
int a[]={,,,,,};
int b[]={,,,,,};
printf("%d\n",LICS(a,b,,));
return ;
}

参考文章:http://blog.csdn.net/yysdsyl/article/details/4226630

最长公共子序列模板(LCS)和LICS模板的更多相关文章

  1. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  2. 最长公共子序列问题 (LCS)

    给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...

  3. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  4. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  5. 【Luogu P1439】最长公共子序列(LCS)

    Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...

  6. 最长递增子序列(lis)最长公共子序列(lcs) 最长公共上升子序列(lics)

    lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int ...

  7. python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)

    问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...

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

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

  9. 最长公共子序列/子串 LCS(模板)

    首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的 1.最长公共子序列 1.最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题 2.同时,子问题的解释可以被重 ...

  10. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

随机推荐

  1. 不是语言之争--Go vs Erlang

    因为 云巴 系统对高并发.低延迟的需求,我们对各个语言.平台做了很多的调研比较工作.这自然就包括致力于开发高并发应用的 Go 和 Erlang. 并发 Go 对高并发的支持通过 goroutine 实 ...

  2. [转]MVC、MVP、MVVM

    界面之下:还原真实的 MVC.MVP.MVVM 模式 [日期:2015-10-28] 来源:github.com/livoras  作者:戴嘉华 [字体:大 中 小]   前言 做客户端开发.前端开发 ...

  3. CSS中background背景色的作用范围

    在div中设置背景色:当border宽度很大时就要考虑一个问题,那就是背景的作用范围,是包括边框呢?还是不包括呢?很明显,又到浏览器产生分歧的时候了. 在IE中背景色的作用范围为:content+pa ...

  4. android ArrayAdapter BaseAdapter SimpleAdapter使用讲解

    不是我针对谁,我只想针对新手玩家. 不清楚Adapter作用的可以看一下http://www.cnblogs.com/zhichaobouke/p/5798672.html (括号里的内容都是我主观添 ...

  5. 关于js中两种定时器的设置及清除

    1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...

  6. 基于MATLAB实现的云模型计算隶属度

    ”云”或者’云滴‘是云模型的基本单元,所谓云是指在其论域上的一个分布,可以用联合概率的形式(x, u)来表示 云模型用三个数据来表示其特征 期望:云滴在论域空间分布的期望,一般用符号Εx表示. 熵:不 ...

  7. Android logcat

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 基本命令 logcat使用方法如下所示: [adb] logcat [<option>] ... [<f ...

  8. OC知识梳理-NSArray与NSMutableArray相关知识

    知识普及: 1.数组中的元素在系统中都会有其默认对应的下标,下标是一个整形的数字,默认从0开始. 例:NSArray *arr3 = @["345","234" ...

  9. IOS 瀑布流UICollectionView实现

    IOS 瀑布流UICollectionView实现 在实现瀑布流之前先来看看瀑布流的雏形(此方法的雏形 UICollectionView) 对于UICollectionView我们有几点注意事项 它和 ...

  10. C++语言-02-函数

    普通函数 C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集 C++中的普通函数与C语言中的普通函数具有类似的性质.请参照以下博客:C语言-04-函数 与类相关的函数 C是一种OOP语言 ...