最长公共子序列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[][];
char str1[],str2[];
int path[][];
int len1,len2;
void printf_lcs(int a,int b)
{
if(!a||!b)//终止条件,其中一个字符串已经走完了
return;
if(path[a][b]==)//往对角线方向走
{
printf_lcs(a-,b-);
cout<<str1[a-];
}
else if(path[a][b]==)//往上走
printf_lcs(a-,b);
else
printf_lcs(a,b-);//往左走
}
int main()
{
cin>>str1;
cin>>str2;
len1=strlen(str1);
len2=strlen(str2);
memset(dp,,sizeof(dp));
memset(path,,sizeof(path));
for(int i=;i<=len1;i++)
{
for(int j=;j<=len2;j++)
{
if(str1[i-]==str2[j-])
{
dp[i][j]=dp[i-][j-]+;
path[i][j]=;//1表示str1[i-1],str2[j-1]两个字符相同 ,可以输出 ,往对角线方向走
}
else //最后两个字符不同时
{
if(dp[i-][j]>=dp[i][j-])
{
dp[i][j]=dp[i-][j];
path[i][j]=;//2表示在我 推荐的博客 的那张图里往上走
}
else
{
dp[i][j]=dp[i][j-];
path[i][j]=;//3表示在我 推荐的博客 的那张图里往左走
}
}
}
}
printf_lcs(len1,len2);
cout<<endl;
return ;
}
最长公共子序列lcs 51nod1006的更多相关文章
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 每日一题-——最长公共子序列(LCS)与最长公共子串
最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...
- 51nod 1006:最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
随机推荐
- Windows下卸载Apache、Mysql
卸载Apache 1. 停止服务 2.以管理员身份打开命令环境 3. 删除Apache文件目录 卸载Mysql 一.在控制面板,卸载MySQL的所有组件控制面板——>所有控制面板项——>程 ...
- element——message-box
`${action}`可以捕获用户选择cancel还是confirm,然后进行相应操作 官方文档:http://element-cn.eleme.io/#/zh-CN/component/messag ...
- Java工具类DateFormatUtils详解
日期和时间格式化实用程序和常量public static String format(Calendar calendar, String pattern) 说明:将日历格式化为特定的模式:参数:cal ...
- Delphi XE8 中TIdTCPClient的WriteLn编码变化!
//XE2中正常的代码: IdTCPClient1.IOHandler.WriteLn(sendData,TEncoding.ANSI); //XE8中不行了,解决方法: //,引入“IdGlobal ...
- jeecg使用小结
1.上传word模板时报“java.lang.UnsatisfiedLinkError: no jacob-1.17-M2-x64 in java.library.path”异常 原因:jdk下没有找 ...
- haproxy + nginx + proxy protocol 获得客户真实IP方法
公司网站架构为: 前面2台HA负载均衡,后面3台Nginx负载均衡反向代理,然后后面有N台WEB服务器 由于要统计IP,需要在WEB服务器日志里体现客户端真实IP 那么问题来了,通过HA代理的HTTP ...
- MyBatis基础-1
1.Mybatis简介 2.Mybatis环境搭建 3.Mybatis的开发方式 一.什么框架 框架其本质是半成品程序,提供相关规范,并且提供大量可重用的组件. 目的:让开发者开发出结构比较良好,可读 ...
- C#调用Delphi接口(ITest = interface)
首先创建一个delphi的DLL工程 library testintfdll; { Important note about DLL memory management: ShareMem must ...
- 面图层拓扑检查和错误自动修改—ArcGIS案例学习笔记
面图层拓扑检查和错误自动修改-ArcGIS案例学习笔记 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 数据源: gis_ex10\ex01\parcel.shp, ...
- eclipse 连接数据库记录
两篇很好的文章介绍给大家: Eclipse使用JDBC方式连接SQLServer2016 通过Driver与DriverManager连接数据库 --------------------------- ...