推荐参考博客:动态规划基础篇之最长公共子序列问题 - 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的更多相关文章

  1. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  2. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  3. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  4. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  5. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  6. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  7. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  8. 每日一题-——最长公共子序列(LCS)与最长公共子串

    最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...

  9. 51nod 1006:最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

随机推荐

  1. Linux 配置开机自启 和 修改环境变量

    [ 操作系统 Centos7 ] 一,开机自动启动的配置 1,赋予 /etc/rc.local 的执行权限 => chmod +x /etc/rc.local 2,在 /etc/rc.local ...

  2. day33-常见内置模块二(hashlib、shutil、configparse)

    一.hashlib算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 1.什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  3. python语言中的数据类型之字典

    数据类型 字典类型dict 用途:记录多个值,列表是索引对应值,而字典是key对应值,其中key对value有描述性 定义方式:在{ }用逗号分隔开多个元素,每个元素都是key:value形式,其中k ...

  4. java基础总结001

    1     sdf.parse()和sdf.format()它们两者的用法   http://www.imooc.com/wenda/detail/324671 3     Java String.s ...

  5. American Football Vocabulary!

    American Football Vocabulary! Share Tweet Share You’ll learn all about the vocabulary of American fo ...

  6. 使用rgba设置输入框背景透明

    项目中遇到要求输入框的背景设置透明度,但文字不受影响,如下图 输入框使用input标签 <input ref="searchText" type="search&q ...

  7. 查看Linux物理CPU个数

    查看内核版本 lsb_release -a 查看物理CPU个数.核数.逻辑CPU个数 (1)具有相同core id的CPU是同一个core的超线程. (2)具有相同physical id的CPU是同一 ...

  8. C# DataTable使用方法详解--删除表数据

    在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 1.添加引用 1 u ...

  9. Android构建项目时出现的小bug们(2018年5月19日19:31:20)

    问题详情 Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency ...

  10. ArcGIS案例学习笔记3_1_地理配准案例_图面控制点

    ArcGIS案例学习笔记3_1_地理配准案例_图面控制点 计划时间:第3天上午 目的:地形图控制点配准 数据:地形图drg 无坐标: 步骤 1.查看地图标注 2. 地理配准,添加控制点 3.结果: 联 ...