/**
* @brief longest common subsequence(LCS)
* @author An
* @data 2013.8.26
**/ #include <iostream>
#include <string>
using namespace std; enum Direction { Zero, LeftUp, Up, Left };
static int m; // length of the first sequence
static int n; // length of the second sequence
static int **c; // the length for every subsequence
static Direction **b; // record the path void LCS_Length( string x, string y );
void Print_LCS( string x, int i, int j );
void PrintTable(); int main()
{
string x = "ABCBDAB";
string y = "BDCABA";
LCS_Length( x, y );
Print_LCS( x, m, n );
cout << endl;
PrintTable();
} void LCS_Length( string x, string y )
{
// initialize two tables
m = x.length();
n = y.length();
c = new int*[m + 1];
b = new Direction*[m + 1];
for ( int i = 0; i <= m; ++i )
{
c[i] = new int[n + 1];
b[i] = new Direction[n + 1];
} // zero row and column
for ( int i = 0; i <= m; ++i )
{
c[i][0] = 0;
b[i][0] = Zero;
}
for ( int j = 1; j <= n; ++j )
{
c[0][j] = 0;
b[0][j] = Zero;
} // calculate the two tables from bottom to top
for ( int i = 1; i <= m; ++i )
{
for ( int j = 1; j <= n; ++j )
{
if ( x[i - 1] == y[j - 1] )
{
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = LeftUp;
}
else if ( c[i - 1][j] >= c[i][j - 1] )
{
c[i][j] = c[i - 1][j];
b[i][j] = Up;
}
else
{
c[i][j] = c[i][j - 1];
b[i][j] = Left;
}
} // end for
} //end for } // end LCS_Length() void Print_LCS( string x, int i, int j )
{
if ( i == 0 || j == 0 )
{
return;
}
if ( b[i][j] == LeftUp )
{
Print_LCS( x, i - 1, j - 1 );
cout << x[i - 1];
}
else if ( b[i][j] == Up )
{
Print_LCS( x, i - 1, j );
}
else
{
Print_LCS( x, i, j - 1 );
}
} void PrintTable()
{
for ( int i = 0; i <= m; ++i )
{
for ( int j = 0; j <= n; ++j )
{
cout << c[i][j] << " ";
}
cout << endl;
}
cout << endl;
for ( int i = 0; i <= m; ++i )
{
for ( int j = 0; j <= n; ++j )
{
cout << b[i][j] << " ";
}
cout << endl;
}
}

动态规划——最长公共子序列(LCS)的更多相关文章

  1. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  2. 动态规划----最长公共子序列(LCS)问题

    题目: 求解两个字符串的最长公共子序列.如 AB34C 和 A1BC2   则最长公共子序列为 ABC. 思路分析:可以用dfs深搜,这里使用到了前面没有见到过的双重循环递归.也可以使用动态规划,在建 ...

  3. 动态规划——最长公共子序列LCS及模板

    摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...

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

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

  5. 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)

    From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...

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

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

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

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

  8. 1006 最长公共子序列Lcs

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

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

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

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

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

随机推荐

  1. HDU 3571 N-dimensional Sphere

    高斯消元,今天数学死了无数次…… #include <cstdio> #include <cstring> #include <cmath> #include &l ...

  2. BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板

    题目 1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer ...

  3. 如何设计一个 iOS 控件?(iOS 控件完全解析)

    前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...

  4. 修改项目工程名 iOS

    结合这两篇原文: http://www.cocoachina.com/ios/20150104/10824.html http://jingyan.baidu.com/article/0964eca2 ...

  5. java之内存可见型

    1.可见性的概念 一个线程对于共享变量的修改,能够及时被其他的线程看到. 2.什么是共享变量 一个变量在多个线程中的工作内存中都存在变量副本,那么这个变量在这几个线程之间共享. 3.Java线程的工作 ...

  6. 一个简单二叉树的C++实现(一)

    很久没有接触二叉树了,写这个当作练手,接下来会比较详细地实现二叉树的各个功能及应用. /* * BinaryTree.cpp * Author: Qiang Xiao * Time: 2015-07- ...

  7. MongoDB Linux下的安装和启动(转)

    1. 下载MongoDB,此处下载的版本是:mongodb-linux-i686-1.8.1.tgz.tar. http://fastdl.mongodb.org/linux/mongodb-linu ...

  8. js中去除换行(\r\n)

    解决方法:replace(/\r\n/g,"").replace("\n","") 测试: <script> var str = ...

  9. 面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】

    这是本门<面向对象程序设计>课最后一次上课,刚好上完了这本<Thinking in C++> :) 这节课首先讲了流 Stream 的概念 平时我们主要用的是(1)在屏幕上输入 ...

  10. NET Core 环境搭建和命令行CLI入门

    NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...