/*** 最长公共子序列* 优化了内存空间的使用* 观察到一件事: 每一个元素的计算,只和其在左上, 左边, 上边的三个元素相关* 可以考虑len(x) + 3* 3个变量 定义为leftAbove, left, above*/
#include<iostream>
#include<string>
#include<memory.h>
using namespace std;int LCS(string x, string y);int main() {string x, y;cin>>x>>y;LCS(x, y);
}int LCS(string x, string y){int lenx = x.length();int leny = y.length();int leftabove, left, above; //左上角 左 上int *compute = new int[leny + 1]; //compute[0] 即原来的calc[i][0] for i in [0, lenx];memset(compute, 0, (leny + 1) * sizeof(int));for(int i = 1; i <= lenx; i++) {leftabove = left = compute[0];above = compute[1];for(int t = 0; t <= leny; t++) cout<<compute[t]<<" ";cout<<endl;for(int j = 1; j <= leny; j++) { //计算,并且更新这三个变量if(x[i - 1] == y[j - 1]) compute[j] = leftabove + 1;else if(left > above)   compute[j] = left;else compute[j] = above;//更新此三个变量,很有技巧的哦leftabove = above;above = compute[j + 1];left = compute[j];}}cout<<compute[leny]<<endl; delete[] compute;
}

受一篇文章启发

http://blog.csdn.net/oyzdz1988/article/details/4456443

发现可以把空间减少到min{lenX, lenY} +O(1) 上述就是代码

从这个题目得到一点认识:只做足够,优化到极致.

关于最长公共子序列问题的空间优化相关推荐

  1. 最长公共子序列(O(n)空间优化、O(nlogn)时间优化)

    普通算法 对于求最长公共子序列,最普遍的就是时间复杂度为O(n^2),空间复杂度为O(n*n)算法.重要的是,若要求出最长公共子序列是什么,则必须使用这一种算法,具体代码如下: int dp[maxn ...

  2. LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化

    LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...

  3. 求最长公共子序列的空间优化。

    我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j]. ...

  4. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  5. 文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法

    在参阅<A Longest Common Subsequence Algorithm Suitable for Similar Text Strings>(Narao Nakatsu,Ya ...

  6. 最长公共子序列(LCS问题)

    先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...

  7. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  8. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  9. java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用

    即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...

最新文章

  1. C#表达式,类型和变量
  2. 0基础学习数据分析必须掌握的技能有哪些?
  3. 设计模式16——Memento设计模式
  4. linux下curl的使用
  5. C++STL容器大全
  6. 维特比算法—打字输入预测
  7. java bitset_Java BitSet nextSetBit()方法与示例
  8. rem布局 html,移动端h5之rem布局/px2rem
  9. 【AtCoder】AGC009
  10. MySQL 输入输出 XML
  11. python文件对象提供了3个读方法、分别是-案例驱动式Python基础与应用-超星尔雅-学习通-题库零氪...
  12. 【C 语言提高、进阶】Day 3
  13. IDEA 社区版下载与安装
  14. windows7计算机用户账户,浅析win7旗舰版系统中三种系统用户账户的特点
  15. php如何实现快速压缩视频,如何把大视频压缩小 怎么将视频压缩到最小方便储存...
  16. 怎么退出自适应巡航_什么是ACC自适应巡航
  17. 查找谷歌浏览器中的Internet选项
  18. 内置式永磁电机maxwell2d_「仿真」永磁同步电机仿真(实操三)Maxwell 2D 静态磁场仿真...
  19. python接入支付宝接口
  20. 英语语法---动词详解

热门文章

  1. zx2020039-2立项报告
  2. 【课程作业】西瓜书 机器学习课后习题 : 第七章
  3. 意想不到的试衣方法, kinect试衣镜将问世,神奇!
  4. docker-compose.yml 配置文件详解
  5. 《Cross-view Transformers for real-time Map-view Semantic Segmentation》论文笔记
  6. 特征值分解用于数据压缩(matlab实现)
  7. Ripro9.0全解密去扩展版修正升级版+两款WP美化包+下载信息美化等插件,新增易支付接口
  8. 计算机的存储器先关知识,最详细的存储器知识大盘点!
  9. 奔驰灯光互动项目开发历险记,2019春节前10天
  10. C语言红皮书(1-8)笔记回顾