最长公共子序列模板(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),我们可以得到一些上升的子序 ...
随机推荐
- DShow实现一个avi视频的播放(含有个人解释和注释)
此项目为win32下的控制台C++代码(别忘记配置DShow库) // movie_test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...
- android: DOC命令:查看后台运行的activity:
DOC命令:查看后台运行的activity: adb shell dumpsys activity running activity: 模拟器曾经运行过的 activity:
- 来自亚马逊CEO Jeff Bezos的20句经验之谈
英文原文:The 20 Smartest Things Jeff Bezos Has Ever Said 当外界对一个公司的热情有些偏离常态时, 就会出现武断的言论,亚马逊对此就深有感受.2000 年 ...
- 解决Sharepoint 2010 custom display form 不显示附件的问题
sharepoint 2010用designer添加自定义的 display form默认是不会显示附件的. 需要添加如下代码才会显示附件: <tr> <td width=" ...
- Android 自定义带刻度的seekbar
自定义带刻度的seekbar 1.布局 <span style="font-family:SimHei;font-size:18px;"><com.imibaby ...
- C# C/S WPF 远程操作服务器上面的文件
作的时候用的是WPF,需要做一个上传附件的功能,服务器上有一个文件夹,附件都上传到里面,只知道URL路径. 文件夹是在服务器上的IIS里面(就比如说你发布一个网站,把文件夹建在网站下面,当然这个网站啥 ...
- iOS开发之网络编程--使用NSURLConnection实现大文件下载
主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...
- MyEclipse Workspace 项目文件 .project .classpath .mymetadata解析
<!-- .classpath文件 --> <?xml version="1.0" encoding="UTF-8"?> <cla ...
- Effective Java 14 In public classes, use accessor methods, not public fields
Principle To offer the benefits of encapsulation you should always expose private field with public ...
- 大写金额字符串生成 C#实现
思路: 中文对金额的描述以四位为一组, 只考虑一万亿以内的数字则每组内以千.百.十和[亿\万\元]区分各位 连续的零按一个处理,组内最低位的零可略去 无角无分说整,有角无分只说角,无角有分说零X分,有 ...