递归式:

实例图解:

代码:

 #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. 用php做了下冒泡排序

    大学没好好读书,那会没怎么明白冒泡排序是这么回事 早上睡到九点多起来,就在房间看书.听歌,下午吃完饭做了下冒泡排序,现在把代码贡献如下: <?php /** * Created by PhpSt ...

  2. PHP json编码遇到的问题

    今天遇到了json编码解码之后中文消失的问题,一探究竟,写下这篇文章 PHP中提供了json_encode  和json_decode 这对函数 将PHP中 值转化成 字符串,但是遇到中文的时候,很容 ...

  3. asp.net webform 与mvc 共享session

    公司内部系统最早是用.net webform模式开发的,现新项目用.net mvc 开发,现存在的问题就是如何保持原有.net webform的登录状态不变,而在mvc中能够验证用户的登录状态,也就是 ...

  4. CSS通过边框border-style来写小三角

    <!DOCTYPE html> /*直接复制代码即可在浏览器验证*/ <html> <head lang="en"> <meta char ...

  5. javascript宿主对象之window.navigator

    window.navigator用来反映浏览器及其功能信息的对象. // 检测浏览器版本信息 function getBrowserInfo(){ var Sys = {}; var ua = win ...

  6. SharePoint 使用PowerShell恢复误删的网站集

    在SharePoint网站集的使用中,我们很有可能会误删我们需要的网站集,SharePoint其实并没有把网站集删掉,只是放到了SPDeletedSite中,这样,我们还可以通过PowerShell找 ...

  7. Fix Internet Explorer Crashes with SharePoint 2013 Online Presence Indicators

    IE中,只要是鼠标浮动到人名字上面的状态的时候,这个状态是与Lync相连接的,IE就会出现停止工作. 以下是解决方法. Until the other day when I figured this ...

  8. 简单好用的Toast封装类——EasyToast

    我们用toast时不能设置显示的时间,而且不支持在线程中展示toast,下面我对原始的toast进行了封装,这样我们可以很方便的进行toast的使用了. package com.kale.lib.ut ...

  9. ubuntu解决arm-linux-gcc no such file的问题

    这种情况是因为你的操作系统是Ubuntu 64位的,而交叉编译工具链都是32位执行程序.要成功运行这些交叉编译工具链,需要与这些工具链相关的32位库.安装命令如下:sudo apt-get insta ...

  10. iOS 利用CoreLocation和MapKit开发搜索附近的商场功能

    代码如下: ////  SearchNearbyShopViewController.m//  SearchNearbyShop////  Created by Linzhixiao on 16/2/ ...