最长公共子序列模板(LCS)和LICS模板
递归式:

实例图解:

代码:
#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模板的更多相关文章
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- 最长公共子序列问题 (LCS)
给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...
- 动态规划法(十)最长公共子序列(LCS)问题
问题介绍 给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...
- 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题
一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld" B = & ...
- 【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 ...
- 最长递增子序列(lis)最长公共子序列(lcs) 最长公共上升子序列(lics)
lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int ...
- python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)
问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...
- nyoj 36 最长公共子序列【LCS模板】
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- 最长公共子序列/子串 LCS(模板)
首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的 1.最长公共子序列 1.最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题 2.同时,子问题的解释可以被重 ...
- 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...
随机推荐
- Android小项目合集(经典教程)包含十五个Android开发应用实例
http://www.cnblogs.com/aimeng/archive/2012/03/28/2422435.html
- j2ee分布式缓存同步实现方案dlcache v1.0.0
现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...
- mac下用ruby安装sass && webstorm下给scss文件添加watch
1.安装rvm 先安装 [Xcode](http://developer.apple.com/xcode/) 开发工具,它将帮你安装好 Unix 环境需要的开发包 sudo curl -L https ...
- 设置ArcGIS的外观改回到出厂
在一般的软件中,都可以在工具-选项中打开相关设置将应用程序的外观改回到出厂.但ArcGIS好像没有,但查帮助文档原来是这样: 配置的更改保存在模板文档中(例如,ArcMap 将其更改保存在 Norma ...
- eclipse 设置豆沙绿保护色,保护眼睛
1.菜单栏 windows–>preferences–>general–>editors–>text editors中 在Appearance color options下修改 ...
- Activity与Fragment的生命周期
今天看到一张图,详细描述了Activity和Fragment的生命周期,好资源共享咯!
- Block的使用及循环引用的解决
Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...
- 如何轻松实现iOS9多任务管理器效果(iCarousel高级教程)
前言 iOS9系统下 为了我司APP的兼容性问题 特意把手上的iOS Mac XCode都升级到了最新的beta版 然后发现iOS9的多任务管理器风格大变 变成了下面这种样子 我忽然想起来之前的文章提 ...
- iOS 你将会遇到的
1.解释ARC原理,ARC引入之后,iOS增加了几个修饰符,分别是什么?并解释何时应该使用? 2.给你一个可变数组aMutableArray,请写出你认为较好的算法代码. 3.UITableView是 ...
- Silverlight项目笔记2:.svc处理程序映射缺失导致的WCF RIA Services异常
在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务器返回了错误:NotFound,监听发现请求数据库的服务异常,访问相 ...