最长公共子序列lcs 51nod1006
推荐参考博客:动态规划基础篇之最长公共子序列问题 - CSDN博客 https://blog.csdn.net/lz161530245/article/details/76943991
个人觉得上面的博客写的真的很好,我觉得我也要简单的写一写思路来加深一下理解,加深一下印象。
如果从前往后推,假设两个字符串str1,str2,长度分别是x,y,我们想求他们的最长公共子序列。
如果我们想知道dp[i][j](str1的前i个字符和str2的前j个字符的最长公共子序列长度)
如果str1[i]==str2[j],那么最长公共子序列的最后一个元素一定为str1[i],dp[i][j]=dp[i-1][j-1];
如果str1[i]!=str2[j],假设最长公共子序列最后一个元素为t,那么分三种情况
若t==str1[i]:那么str2[j]就可以排除在外了,即dp[i][j]=dp[i][j-1];
若t==str2[j]:那么str1[i]就可以排除在外了,即dp[i][j]=dp[i-1][j];
若t!=str1[i]&&t!=str2[j]:那么str1[i],str2[j]都排除在外,即dp[i][j]=dp[i-1][j-1];但是实际上出现这种情况的时候,
dp[i-1][j-1]=dp[i-1][j]=dp[i][j-1];因为我们在str1后面加一个str1[i]或者在str2后面加一个str2[j],它的最长公共子序列是不变的,长度当然也不变。所以我们得出结论:若str1[i]!=str[j],dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
期间还可以用path记录路径,输出最长公共子序列
例题:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<cmath> #include<vector> #include<fstream> #include<set> #include<cstdio> #include<string> #include<deque> using namespace std; #define eps 1e-8 #define ll long long #define INF 0x3f3f3f3f int dp[1005][1005]; char str1[1005],str2[1005]; int path[1005][1005]; int len1,len2; void printf_lcs(int a,int b) {if(!a||!b)//终止条件,其中一个字符串已经走完了 return;if(path[a][b]==1)//往对角线方向走 {printf_lcs(a-1,b-1);cout<<str1[a-1];}else if(path[a][b]==2)//往上走 printf_lcs(a-1,b);elseprintf_lcs(a,b-1);//往左走 } int main() {cin>>str1;cin>>str2;len1=strlen(str1);len2=strlen(str2);memset(dp,0,sizeof(dp));memset(path,0,sizeof(path));for(int i=1;i<=len1;i++){for(int j=1;j<=len2;j++){if(str1[i-1]==str2[j-1]){dp[i][j]=dp[i-1][j-1]+1;path[i][j]=1;//1表示str1[i-1],str2[j-1]两个字符相同 ,可以输出 ,往对角线方向走 }else //最后两个字符不同时 {if(dp[i-1][j]>=dp[i][j-1]){dp[i][j]=dp[i-1][j];path[i][j]=2;//2表示在我 推荐的博客 的那张图里往上走 }else{dp[i][j]=dp[i][j-1];path[i][j]=3;//3表示在我 推荐的博客 的那张图里往左走 } } }}printf_lcs(len1,len2);cout<<endl; return 0; }
转载于:https://www.cnblogs.com/6262369sss/p/9267720.html
最长公共子序列lcs 51nod1006相关推荐
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 动态规划之最长公共子序列(LCS)
最长公共子序列(LCS,Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最 ...
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...
- 算法之最长公共子序列(LCS)问题
算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...
- 最长公共子序列php,动态规划(最长公共子序列LCS)
概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...
- python实现求解最长公共子序列LCS问题
在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...
- 算法导论-----最长公共子序列LCS(动态规划)
目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理 1. 子序列(subsequence): 一个 ...
- 动态规划表格法解决最长公共子序列(LCS)问题
3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...
- 最长公共子序列 (LCS) 详解+例题模板(全)
欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...
- 相似度:最长公共子序列--LCS
一.概念 1.子序列 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序).如序列[A,B,C,B,D,A,B]的子序列有:[A,B],[B,C,A],[A,D, ...
最新文章
- 第五章 Spring进阶-注解方式实现AOP(1)
- [转]我们为什么需要工作流
- 在SecureCRT中,hbase shell不能回退的问题
- Mybatis的update方法
- http://www.gamesofdesire.com/
- python数据科学-单变量数据分析
- .NET生态系统概览
- linux nginx安装
- laravel admin 根绝model创建控制器路由命令
- python选择排序算法图解_简单选择排序算法(C语言详解版)
- url 的正则表达式:path-to-regexp
- widow下svn上传项目时的文件可执行权限问题
- 【渝粤教育】国家开放大学2018年春季 0008-21T简明现代汉语 参考试题
- Android开发之实现多次点击事件
- 书里都没的高清无码彩图【人人都是产品经理:9084】
- Differential Geometry之第十章极小曲面
- Photoshop选区选取详解
- 【微信小程序】微信支付
- CSDN日报20170727——《想提高团队技术,来试试这个套路!》
- 输入圆的的半径r 和一个整型数k,当k=1 时,计算圆的面积;当k=2 时,计算圆的周长;当k = 3 时,既要求求圆的周长也要求出圆的面积