热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态规划:LCS(最长公共子序列)

问题描述 求两字符序列的最长公共字符子序列。 补充说明: 不强制要求子串的字符连续出现在原始的2个字符序列中。测试字符序列,比如, NameValue第

问题描述


求两字符序列的最长公共字符子序列。

补充说明:

  • 不强制要求子串的字符连续出现在原始的2个字符序列中。
  • 测试字符序列,比如,

NameValue
第1个字符序列 S[x]{‘A’, ‘B’, ‘C’, ‘B’, ‘D’, ‘A’, ‘B’}
第2个字符序列 W[y]{‘B’, ‘D’, ‘C’, ‘A’, ‘B’, ‘A’}

解决思路


确立状态方程

参考图1.表格所示,记 LCS(x, y) 为表格中的元素,该元素表示截止到第1序列中的字符‘x’和第2序列中的字符‘y’时已有多少个相同的字符个数,即公共子序列的长度。

这里写图片描述
图1.

LCS(x,y)=LCS(x1,y1)+1,LCS(x,y)=max(LCS(x1,y),LCS(x,y1)),LCS(0,0)=0,if S(x) = W(y)if S(x) != W(y)if x = 0 or y = 0 

图1.中箭头的方向表示当前的“公共子序列长度”继承自哪个前一个位置,这里,如果有

[LCS(x1,y)=LCS(x,y1), S(x) != W(y)]
的情况,则如
图1.所示,当前LCS(x, y)元素值优先继承自纵轴上方的那个(箭头↑)。由此,亦可以看出,最长公共子序列并非唯一的。

代码

///////////////////////////////////////////////////////////////
//
// @2017-10-13 DP : LCS 最长公共子序列
// 时间复杂度 O(n*m)
// 空间复杂度 O(n*m)
//
///////////////////////////////////////////////////////////////
// 头文件
#include
#include using namespace std;//@2017-10-13 TY 需考虑使用变长度数组 , 考虑使用 vector 实现变长二维数组
#define ArraySize 16
int dp[ArraySize][ArraySize]={0};///////////////////////////////////////////////////////////////
// DP LCS API
void DpLCS(vector<char>::iterator pVecX, vector<char>::iterator pVecY, int x, int y);///////////////////////////////////////////////////////////////
//
int main(void)
{char cBufX[] &#61; {&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;B&#39;, &#39;D&#39;, &#39;A&#39;, &#39;B&#39;};char cBufY[] &#61; {&#39;B&#39;, &#39;D&#39;, &#39;C&#39;, &#39;A&#39;, &#39;B&#39;, &#39;A&#39;};vector<char> vecX, vecY;// 赋初值for (int i&#61;0; i<(sizeof(cBufX)/sizeof(char)); i&#43;&#43;){vecX.push_back(cBufX[i]);//cout <}for (int i&#61;0; i<(sizeof(cBufY)/sizeof(char)); i&#43;&#43;){vecY.push_back(cBufY[i]);//cout <} // DP : LCS // 二维数组存储的是 状态方程 的值 for (int i&#61;0; ifor (int j&#61;0; jif (vecX.at(i) &#61;&#61; vecY.at(j)){dp[i&#43;1][j&#43;1] &#61; dp[i][j]&#43;1;}else{dp[i&#43;1][j&#43;1] &#61; std::max(dp[i][j&#43;1], dp[i&#43;1][j]);}}}/*// 打印 表格 content for (int i&#61;0; i // Graph DpLCS(vecX.begin(), vecY.begin(), vecX.size(), vecY.size());system("pause");return 0;
}///////////////////////////////////////////////////////////////
// &#64;2017-10-13 DP LCS
// DP : LCS
// (1) 从数列结尾向前递归.
// (2) 结束的边界条件是 return ;
void DpLCS(vector<char>::iterator pVecX, vector<char>::iterator pVecY, int x, int y)
{if (x &#61;&#61; 0 || y &#61;&#61; 0)return ;if (*(pVecX&#43;x-1) &#61;&#61; *(pVecY&#43;y-1)){DpLCS(pVecX, pVecY, x-1, y-1);cout <<*(pVecX&#43;x-1) <<&#39; &#39;;}else if (dp[x-1][y] &#61;&#61; dp[x][y]){DpLCS(pVecX, pVecY, x-1, y);}else{DpLCS(pVecX, pVecY, x, y-1);}
}


推荐阅读
  • 实验六提交版
    1.21.3part2共用体与结构体类型的区别?答:共用体与结构体的区别在于它们的表示方法不同。结构体内,结构体的各成员顺序排列存储,每个成员都有自己独立的存储位置,而共用体的情况 ... [详细]
  • 题意:多模式串匹配,输出模式串的ID思路:典型AC自动机.用向量存储答案ID#include<cstdio>#include<cstring> ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了高效算法求解数独相关的知识,希望对你有一定的参考价值。title:高效算法求解数独 ... [详细]
  • 做了题还是忍不住要写一发题解,感觉楼下的不易懂啊。本题解使用latex纯手写精心打造。题意:求\(\frac{1}{x}\frac{1}{y}\frac ... [详细]
  • 2017年二级计算机c真题语言,2017全国计算机二级C考试真题
    2017全国计算机二级C考试真题【2017全国计算机二级C考试真题】一、改错题函数fun的功能是:将一副扑克牌编号为1,2,353,54,以某种特 ... [详细]
  • 1.关于new:new单个对象new在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象 ... [详细]
  • 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员或静态方法#只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变 ... [详细]
  • 0-0#includeintmain(intargc,charconst*argv[]){std::cout ... [详细]
  •   好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ  实际上这题只要顺藤摸瓜就可以了。首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数;2. ... [详细]
  • 哈密顿圈|回溯-6原文:https://www.geesfo ... [详细]
  • [转]Makefile 使用总结
    2019独角兽企业重金招聘Python工程师标准1.Makefile简介Makefile是和make命令一起配合使用的.很多大型项目的编译都是通过Makefile来组织的,如 ... [详细]
  • 数据结构学习记录(六)树
    前言树:有且只有一个称为根的节点,有若干个互不相交的子树,这些子树本身也是一颗树。通俗理解:树由节点与边组成, ... [详细]
  • *题意:往区间[1,10000000]的墙上贴海报,海报数量 ... [详细]
  • rk3399的gpu测试节点在:catsysdevicesplatformff9a0000.gpudevfreqff9a0000.gpuload如果没有使用gpu的话 ... [详细]
  • 目录题目描述代码出现的问题和解决方法最大N和M随机,元素取到正负10000监测点超时题目描述将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i& ... [详细]
author-avatar
小鬼shenzhen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有