动态规划求解LCS最长公共子序列问题c++
文章目录
- 求最长公共子序列
- 最长公共子序列问题
- 刻画最长公共子序列的特征
- 递归公式
- 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。
- 如果 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。
- 如果xmx_mxm ≠\neq= yny_nyn,那么zkz_kzk ≠\neq= xmx_mxm意味着ZZZ是Xm−1X_{m-1}Xm−1 和 YYY 的一个LCSLCSLCS。
- 如果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++代码
求最长公共子序列长度
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;
}
打印任意一组最长公共子序列
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++相关推荐
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
- 算法复习——动态规划篇之最长公共子序列问题
算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...
- LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化
LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...
- LCS最长公共子序列和LIS最长上升子序列——例题剖析
一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...
- 用动态规划算法实现最长公共子序列问题的算法(java实现)
用动态规划算法实现最长公共子序列问题的算法 public class longestCommonSubsequence {//构造追踪数组rec,记录子问题来源private static Strin ...
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 动态规划_求最长公共子序列LCS
学习动态规划有段时间了,我自己的感觉是看到题解很明白,但是拿到新题就后脑冒汗了,费解!我知道这其实是理解不深的缘故,动态规划是解决一类问题的方法,而不是解决某个问题的解法.今天我试着去感觉一下怎么去思 ...
- DP方法(动态规划) 寻找最长公共子序列 LCS问题(c++)
Q:有两个序列x,y.其中x={x1,x2-xm},y={y1,y2-yn}.寻找x与y的最长公共子序列. 注:子序列和子串有区别,字串是连续的,而子序列可间断. 呃(⊙﹏⊙),后面的暂时没时间写了, ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
最新文章
- 从源码分析DEARGUI之add_text_point
- python可变参数_Python 的四种共享传参详解
- 网页同步交互和异步交互的区别?
- 黑客数字雨html单页,Hei客帝国数字雨.html
- HDOJ 1298 T9(trie树简单应用)
- 奥克兰大学计算机科学与技术,奥克兰大学与2016级计算机科学技术专业(中外合作办学)学生见面会顺利进行...
- YAML/Properties配置文件与Spring Boot(转)
- 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
- c# owc11 双Y轴
- atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结
- 为IntelliJ IDEA安装EmmyLua插件
- 免费使用短信服务接口 ----用Java实现
- Python给excel加密(linux可用版)
- clappr:可扩展网页媒体播放器使用(在vue中的使用)
- IMSI前5位对应移动运营商名称的列表
- .mat图像显示(MATLAB实现)
- FLASH外部链接的几种方法
- el-upload上传文件
- 不愧java_JAVA高手请进
- 电脑花屏死机怎么办?
热门文章
- 腾讯云公布5G产品矩阵,年底前交付300个边缘计算中心
- 12v电源正负极区分_监控12v电源如何区分正负极?
- 远程办公之ZeroTier
- python 正态分布图_Python工具(正态分布对比图)
- 【机器学习】卷积的计算及两种特殊卷积的介绍
- php 利用GD库将正方形图片变成圆形
- python36.lib如何区分release debug_从sou安装python3.6.3后lsb_release不工作
- html binding属性,Style Binding(Style属性绑定)
- 前后端分离项目跨域问题及解决方案
- 【CTF bugku 备份是个好习惯】关于.bak备份文件,md5绕过