递归式:

实例图解:

代码:

 #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. java响应微信用户信息(wechat4j)

    你的微信应用程序接收到用户发送的消息事件之后,可以进行响应.wechat4j支持多种消息的响应. wechat4j响应消息的部分在wechat4j的入口WechatSupport.java中定义,直接 ...

  2. 关于使用ResultSet ---结果集没有当前行

    Resultset返回的结果集是从结果的前一句开始的,也就是说一开始的resultset是没有的,所以,一般使用的时候,需要这样子写:      while( resultSet.next() ){ ...

  3. swift学习笔记之-析构过程

    //析构过程deist import UIKit /*析构过程(Deinitialization):析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示 ...

  4. JavaScript正则表达式小记

    RegExp.html div.oembedall-githubrepos{border:1px solid #DDD;border-radius:4px;list-style-type:none;m ...

  5. Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题

    安装完Lync客户端后,运行时Lync客户端时,报出如下错误: [原因解析] Lync客户端没有正确安装CA证书链. [解决办法] 第一种方法:将计算机加入域. 第二种方法:不加入域的处理方法: 1. ...

  6. UC如被百度控股,手机qq浏览器改如何进攻和防守

    很早以前在公司内部论坛里写的一篇文章,绯闻已经过过去了,现在已物事人物,UC已有阿里大靠山了. ----------------------------------------------- 据网络媒 ...

  7. iOS Block(一)

    Block使用总结: 1.格式: ReturnType (^ BlockName)(参数…); //例: int (^ BFunc) (int a, int b); 2.block赋值: block名 ...

  8. java集合 之 set 集合

    set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法). 1.HashSet类 HashSet按照Hash算法存储集合中的元素,具有很好的 ...

  9. 推送(PUSH)

    一.本地推送 1.建立本地推送 UILocalNotification *notification = [[UILocalNotification alloc] init]; //推送的内容 noti ...

  10. centos性能监控系列二:Collectl初解

    对于一个 Linux 系统管理员来说确保自己管理的系统处于一个良好的状态是其首要责任. Linux 系统管理员可以找到有很多工具来帮助自己监控和显示系统中的进程,例如 top 和 htop 今天介绍一 ...