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.实现:

  1. #include<string>
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. int arr[][] = {};
  6. void LCS(string str1, string str2){
  7. int len1 = str1.length();
  8. int len2 = str2.length();
  9. //边界
  10. for (int i = ; i <= len1; i++)
  11. arr[i][] = ;
  12. for (int j = ; j <= len2; j++)
  13. arr[][j] = ;
  14. //检验
  15. for (int i = ; i <= len1; i++)
  16. {
  17. for (int j = ; j <= len2; j++)
  18. {
  19. if (str1[i - ] == str2[j - ]) //记录
  20. {
  21. arr[i][j] = arr[i - ][j - ] + ;
  22. }
  23. else if (arr[i][j - ] >= arr[i - ][j])
  24. {
  25. arr[i][j] = arr[i][j - ];
  26. }
  27. else
  28. {
  29. arr[i][j] = arr[i - ][j];
  30. }
  31. }
  32. }
  33. }
  34.  
  35. void printLCS(string str1, string str2,int len1, int len2){
  36. cout << "最长公共子序列长为:" << arr[len1][len2] << endl;
  37. //倒序输出
  38. while (len1&&len2){
  39. if (str1[len1-]==str2[len2-])
  40. {
  41. cout << str1[len1 - ];
  42. len1--;
  43. len2--;
  44. }
  45. else if (arr[len1][len2-]>=arr[len1-][len2])
  46. {
  47. len2--;
  48. }
  49. else{
  50. len1--;
  51. }
  52. }
  53. cout << endl;
  54. }
  55.  
  56. int main()
  57. {
  58. string str1 = "abcdsnnnn";
  59. string str2 = "acbdanm";
  60. LCS(str1, str2);
  61. printLCS(str1, str2,str1.length(), str2.length());
  62. return ;
  63. }

动态规划二:最长公共子序列(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. Clevo P950笔记本加装4G模块

    要补全的电路部分如下(原理图见附件) 这里经过尝试,发现左上角R217,R218不用接,3G_POWER部分不接(包括MTS3572G6.UK3018及电阻电容,3G_PWR_EN实测是3.3V,驱动 ...

  2. Codeforces Round #350 (Div. 2) C

    C. Cinema time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  3. 设置查看java的源程序

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  4. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...

  5. Drupal7所见即所得模块CKEditor

    初学Drupal(7.26),刚好遇到一个需要用到CKEditor模块的项目,于是就摸索着把它给装上了. 图片上传出问题 回到Drupal7的管理页面后刚好发现了对于CKEditor的“状态报告”(错 ...

  6. [POJ1595]欧拉线性筛(虽然这道题不需要...)

    欧拉线性筛. 对于它的复杂度的计算大概思考了很久. procedure build_prime; var i,j:longint; begin fillchar(vis,sizeof(vis),tru ...

  7. 【BZOJ】ARC083 E - Bichrome Tree

    [算法]树型DP [题意]给定含n个点的树的形态,和n个数字Xv,要求给每个点赋予黑色或白色和权值,满足对于每个点v,子树v中和v同色的点的权值和等于Xv.n<=10^5 [题解]首先每个点的权 ...

  8. HDU 4334 Trouble (数组合并)

    Trouble Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. bzoj 2064 DP

    这道题可以抽象成两个数列,将一个数列变换为另一个 数列的代价最小 首先我们可以处理出所有的状态代表,对于每个状态 用二进制来表示,代表的是两个数列中的每一项选还是不选 那么答案最多为n1+n2-2,也 ...

  10. JS组件入门

    用React感觉component老好用了. 那如何用原生JS来模拟实现React中的component方法呢:http://huziketang.com/blog/posts/detail?post ...