1.两个子序列:X={x1,x2....xm},Y={y1,y2....yn},设Z={z1,z2...zk}。

  2.最优子结构:

  1)如果xm=y,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS。

  2)如果xm!=y,则zk!=xm包含Z是Xm-1和Y的一个LCS。

  3)如果xm!=y,则zk!=yn包含Z是X和Yn-1的一个LCS。

  3.则由最优子结构可得递归式:

  aaarticlea/png;base64,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" alt="" />

  4.实现:

 #include<string>
#include<iostream>
using namespace std; int arr[][] = {};
void LCS(string str1, string str2){
int len1 = str1.length();
int len2 = str2.length();
//边界
for (int i = ; i <= len1; i++)
arr[i][] = ;
for (int j = ; j <= len2; j++)
arr[][j] = ;
//检验
for (int i = ; i <= len1; i++)
{
for (int j = ; j <= len2; j++)
{
if (str1[i - ] == str2[j - ]) //记录
{
arr[i][j] = arr[i - ][j - ] + ;
}
else if (arr[i][j - ] >= arr[i - ][j])
{
arr[i][j] = arr[i][j - ];
}
else
{
arr[i][j] = arr[i - ][j];
}
}
}
} void printLCS(string str1, string str2,int len1, int len2){
cout << "最长公共子序列长为:" << arr[len1][len2] << endl;
//倒序输出
while (len1&&len2){
if (str1[len1-]==str2[len2-])
{
cout << str1[len1 - ];
len1--;
len2--;
}
else if (arr[len1][len2-]>=arr[len1-][len2])
{
len2--;
}
else{
len1--;
}
}
cout << endl;
} int main()
{
string str1 = "abcdsnnnn";
string str2 = "acbdanm";
LCS(str1, str2);
printLCS(str1, str2,str1.length(), str2.length());
return ;
}

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

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

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

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

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

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

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

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

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

  5. 1006 最长公共子序列Lcs

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. BZOJ3522 POI2014HOT-Hotels(树形dp)

    分两种情况.三点两两lca相同:在三点的lca处对其统计即可,显然其离lca距离应相同:某点在另两点lca的子树外部:对每个点统计出与其距离x的点有多少个即可. 可以长链剖分做到线性,当然不会. #i ...

  2. BZOJ4347 POI2016Nim z utrudnieniem(博弈+动态规划)

    由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0. 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数.注意到总石子数量不超过1e7,按ai从小到大 ...

  3. CF115B Lawnmower

    题目描述 You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m ...

  4. [NOI2016 D2T1]区间

    题目大意:在数轴上有$n$个闭区间$[l_1,r_1],[l_2,r_2],...,[l_n,r_n]$.现在要从中选出 $m$ 个区间,使得这 $m$ 个区间共同包含至少一个位置.输出被选中的最长区 ...

  5. apache代理服务器配置

    1. 扩展开启,httpd.conf开启一下选项 LoadModule proxy modules/proxy.so LoadModule proxy_connect modules/proxy_co ...

  6. Python之日志操作(logging)

    import logging   1.自定义日志级别,日志格式,输出位置 logging.basicConfig( level=logging.DEBUG, format='%(asctime)s | ...

  7. c++ 公有继承的赋值兼容规则

    赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...

  8. HDU2571--命运---DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2571 #include "iostream" #include "cstdio&q ...

  9. Linux基础(1)

    一.Linux的安装及相关配置 1.VMware Workstation安装CentOS7.0 图文版 详细步骤可以看连接:http://blog.csdn.net/alex_my/article/d ...

  10. noip2013 提高组

    T1 转圈游戏 题目传送门 果不其然 第一题还是模拟题 一波快速幂解决问题 #include<cstdio> #include<cstring> #include<alg ...