推荐参考博客:动态规划基础篇之最长公共子序列问题 - 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. Flex+BlazeDS+java通信详细笔记2-推送

    前台是Air,后台是java 在运行之前,先要在IE地址栏输入http://127.0.0.1:8080/PushDemo/TickCacheServlet?cmd=start 激活它. 地址:htt ...

  2. ln: 创建符号链接 "/usr/bin/java": 文件已存在

    执行下述命令创建软链接 #ln -s $JAVA_HOME/bin/java /usr/bin/java 出现下述错误提示: ln: 创建符号链接 "/usr/bin/java": ...

  3. 关于存session,cookie还是数据库或者memcache的优劣,部分网上抄录

    从效率考虑:cookie > memcache > 数据库cookie对服务器端负载没影响,如果加密.解密会多消耗一点点cpu.带宽倒是会消耗得多一点,同域名下的所有http reques ...

  4. JVM的 GC机制和内存管理

    GC机制:java垃圾回收机制,垃圾收集器线程(Garbage Collection Thread)在 JVM 处于空闲循环式,会自动回收无用的内存块. 垃圾收集算法:1.引用计数  2.根搜索  3 ...

  5. Spring boot 配置文件 加载顺序

    springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ – ...

  6. CSS TYPOGRAPHY

    CSS TYPOGRAPHY Review Great job! You learned how to style an important aspect of the user experience ...

  7. python语言中的数据类型

    一.内存管理 1.python解释器的垃圾回收机制 垃圾:当一个值上没有人绑定任何变量名时(当引用计数为0),该值就是一个垃圾. python解释器运行时会检测值的引用计数,当引用计数=0该值会被清除 ...

  8. Haskell语言学习笔记(78)fix

    fix 函数 fix 是一个在 Data.Function 模块中定义的函数,它是对于递归的封装,可以用于定义不动点函数. fix :: (a -> a) -> a fix f = let ...

  9. ajax分页代码

    <meta charset="utf-8"><?php//连接数据库$link = mysqli_connect('127.0.0.1','root','root ...

  10. 检测浏览器是否支持cookie功能

    <script> if(navigator.cookieEnabled) { document.write("你的浏览器支持cookie功能!"); } else{ d ...