文章目录

  • 求最长公共子序列
    • 最长公共子序列问题
    • 刻画最长公共子序列的特征
    • 递归公式
    • C++代码
      • 求最长公共子序列长度
      • 打印任意一组最长公共子序列
    • 模板题

求最长公共子序列

最长公共子序列问题

Longest-Common-Subsequence problem)给定两个序列 XXX = <x1x_1x1​,x2x_2x2​,…{\ldots}…,xmx_mxm​> 和 YYY= <y1y_1y1​,y2y_2y2​,…{\ldots}…,yny_nyn​> ,求XXX和YYY长度最长的公共子序列

一个字符串 sss 被称作另一个字符串 SSS 的子序列,说明从序列 SSS
通过去除某些元素但不破坏余下元素的相对位置(在前或在后)可得到序列 sss 。

例如:有两个字符串 SSS 和 TTT ,SSS = “abcde”,TTT = “acbfe”,那么SSS,TTT的最长公共子序列就是 “ace”,长度为3。

刻画最长公共子序列的特征

LCS的最优子结构:令XXX = <x1x_1x1​,x2x_2x2​,…{\ldots}…,xmx_mxm​> 和 YYY=
<y1y_1y1​,y2y_2y2​,…{\ldots}…,yny_nyn​> 为两个序列,ZZZ =
<z1z_1z1​,z2z_2z2​,…{\ldots}…,zkz_kzk​> 为XXX和YYY的任意LCSLCSLCS。

  1. 如果 xmx_mxm​ = yny_nyn​ ,则zkz_kzk​ = xmx_mxm​ = yny_nyn​,且Zk−1Z_{k-1}Zk−1​是Xm−1X_{m-1}Xm−1​和Yn−1Y_{n-1}Yn−1​的一个LCSLCSLCS。
  2. 如果xmx_mxm​ ≠\neq​= yny_nyn​,那么zkz_kzk​ ≠\neq​= xmx_mxm​意味着ZZZ是Xm−1X_{m-1}Xm−1​ 和 YYY 的一个LCSLCSLCS。
  3. 如果xmx_mxm​ ≠\neq​= yny_nyn​,那么zkz_kzk​ ≠\neq​= yny_nyn​意味着ZZZ是XXX 和 Yn−1Y_{n-1}Yn−1​ 的一个LCSLCSLCS。
递归公式

根据 LCSLCSLCS 问题的最优子结构性质,可以得到如下公式:

其中dp[ i ] [ j ]表示 S1iS1_iS1i​ 和 S2jS2_jS2j​ 的LCSLCSLCS长度。

C++代码
  1. 求最长公共子序列长度
int dp[1010][1010];
int main()
{string s1,s2;cin>>s1>>s2int len1=s1.length();int len2=s2.length();memset(dp,0,sizeof(dp));for(int i=1;i<=len1;i++)for(int j=1;j<=len2;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}cout<<dp[len1][len2]<<endl;
}
  1. 打印任意一组最长公共子序列
int dp[3010][3010];
int b[3010][3010];//记录路径
void print_LCS(string s,int i,int j)
{if(i==0 || j==0) return;if(b[i][j]==0){print_LCS(s,i-1,j-1);cout<<s[i-1];                                                     }else if(b[i][j]==-1){print_LCS(s,i-1,j);}else print_LCS(s,i,j-1);
}
int main()
{string s,t;cin>>s>>t;int len1=s.length();int len2=t.length();memset(dp,0,sizeof(dp));for(int i=1;i<=len1;i++)for(int j=1;j<=len2;j++){if(s[i-1]==t[j-1]){dp[i][j]=dp[i-1][j-1]+1;b[i][j]=0;//0表示指向左上方 }else if(dp[i-1][j]>=dp[i][j-1]){dp[i][j]=dp[i-1][j];b[i][j]=-1;//-1表示指向上方 }else{dp[i][j]=dp[i][j-1];b[i][j]=1;//1表示指向左方 }}print_LCS(s,len1,len2);return 0;
}
模板题

求最长公共子序列的长度

poj1458 Common Subsequence

打印最长公共子序列

luogu AT4527 LCS

动态规划求解LCS最长公共子序列问题c++相关推荐

  1. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  2. 算法复习——动态规划篇之最长公共子序列问题

    算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...

  3. LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化

    LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...

  4. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  5. 用动态规划算法实现最长公共子序列问题的算法(java实现)

    用动态规划算法实现最长公共子序列问题的算法 public class longestCommonSubsequence {//构造追踪数组rec,记录子问题来源private static Strin ...

  6. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  7. 动态规划_求最长公共子序列LCS

    学习动态规划有段时间了,我自己的感觉是看到题解很明白,但是拿到新题就后脑冒汗了,费解!我知道这其实是理解不深的缘故,动态规划是解决一类问题的方法,而不是解决某个问题的解法.今天我试着去感觉一下怎么去思 ...

  8. DP方法(动态规划) 寻找最长公共子序列 LCS问题(c++)

    Q:有两个序列x,y.其中x={x1,x2-xm},y={y1,y2-yn}.寻找x与y的最长公共子序列. 注:子序列和子串有区别,字串是连续的,而子序列可间断. 呃(⊙﹏⊙),后面的暂时没时间写了, ...

  9. LCS最长公共子序列(最优线性时间O(n))

    这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...

最新文章

  1. 从源码分析DEARGUI之add_text_point
  2. python可变参数_Python 的四种共享传参详解
  3. 网页同步交互和异步交互的区别?
  4. 黑客数字雨html单页,Hei客帝国数字雨.html
  5. HDOJ 1298 T9(trie树简单应用)
  6. 奥克兰大学计算机科学与技术,奥克兰大学与2016级计算机科学技术专业(中外合作办学)学生见面会顺利进行...
  7. YAML/Properties配置文件与Spring Boot(转)
  8. 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
  9. c# owc11 双Y轴
  10. atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结
  11. 为IntelliJ IDEA安装EmmyLua插件
  12. 免费使用短信服务接口 ----用Java实现
  13. Python给excel加密(linux可用版)
  14. clappr:可扩展网页媒体播放器使用(在vue中的使用)
  15. IMSI前5位对应移动运营商名称的列表
  16. .mat图像显示(MATLAB实现)
  17. FLASH外部链接的几种方法
  18. el-upload上传文件
  19. 不愧java_JAVA高手请进
  20. 电脑花屏死机怎么办?

热门文章

  1. 腾讯云公布5G产品矩阵,年底前交付300个边缘计算中心
  2. 12v电源正负极区分_监控12v电源如何区分正负极?
  3. 远程办公之ZeroTier
  4. python 正态分布图_Python工具(正态分布对比图)
  5. 【机器学习】卷积的计算及两种特殊卷积的介绍
  6. php 利用GD库将正方形图片变成圆形
  7. python36.lib如何区分release debug_从sou安装python3.6.3后lsb_release不工作
  8. html binding属性,Style Binding(Style属性绑定)
  9. 前后端分离项目跨域问题及解决方案
  10. 【CTF bugku 备份是个好习惯】关于.bak备份文件,md5绕过