最长公共子序列(不连续)

实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面。

这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行:

按最普通的方式就是,直接构造二维矩阵,两个序列分别是Ai 以及 Bj ,c[i,j]就表示的是第一个序列的从开始到第Ai个元素,以及第二个序列的从开始到第Bj个元素,这两部分序列的最长的公共子序列,如果ai==bj,则斜对角加1,否则就是前面和上面的元素中最大的那一个,就是按照这种方式,一层层的向下递推。

最长连续公共子序列

就是strict-LCS的情形,

这里c[I,j]的定义与原来有所不同,这里的才c[I,j]指的是最后一个元素为xi时候,并且xi==yj时候的的长度。

不论前面的情况如何,如果xi与yj不相等,就将c[I,j]归为0 其实转移方程也还是比较简易的:

就是把累加性的部分去掉就好了。

PAT1040

这个最终也可以转化成LCS的思路来求解 如果一个序列中间有连续的对称部分的话 不过这个是最长连续的公共子序列。

最长递增公共子序列

1045

这个是比较典型的

这个可以有多种解法

一个是转化成LCS,一个是就用最本来的LIS的递归的方法,可以参考这个:

http://blog.csdn.net/joylnwang/article/details/6766317

其实转化成LCS,可以算成一种变形:

http://blog.csdn.net/tiantangrenjian/article/details/19921051

这个可以算成是公共部分可以重复的最长公共子序列,但是这个重复的部分也应该是其中某个序列中的,整体来说,就是这个题目的背景。

这个时候递归的时候:
还是通过矩阵向后递推,只是:

先要求出max元素,如果当前的元素是c[I,j],那么c[i-1][j] c[I,j-1] c[i-1,j-1]中的最大一个,把它称为max元素,通常像这样:

1.  max = len[i-1][j-1];

2. if(max < len[i][j-1])max = len[i][j-1];

3. if(max < len[i-1][j])max = len[i-1][j];      //先求出左边、上边、左上边 三个值中的最大值

A[i]=B[j]的时候 直接才c[I,j]=max+1

A[i]!=B[j]的时候 直接c[I,j]=max

注意这里直接放成max 根据max往后走。

对于这个题,还是用这种方法比较好,要是用最简单的LCS就是按照color出现的顺序来对原来的stripe进行排序,并且将没有出现的元素滤去,这样需要申请m[N][N]的空间,题中的N给的比较大,很可能超时。

LCS的递归不像背包问题的那种,可以用一行来结局,要是用两行的话,就得不断的把之前的一行保存下来,这里N的时候,又是容易发生超时。

最长连续公共子序列(LCS)与最长递增公共子序列(LIS)的更多相关文章

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

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

  2. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  3. Codeforces 527C Glass Carving (最长连续0变形+线段树)

    Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...

  4. CodeForces 527C. Glass Carving (SBT,线段树,set,最长连续0)

    原题地址:http://codeforces.com/problemset/problem/527/C Examples input H V V V output input H V V H V ou ...

  5. 51nod 1006 最长公共子序列Lcs(经典动态规划)

    传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是 ...

  6. 1006 最长公共子序列Lcs

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

  7. 最长公共子序列LCS

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. LCS具有最优子结构,且满足重叠子问题的 ...

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

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

  9. 【51NOD】1006 最长公共子序列Lcs(动态规划)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

随机推荐

  1. java 继承extends 的相关知识点

    java只有单继承,不能多继承 子类只能继承父类的非私有成员(成员变量.成员方法) 子类不能继承父类的构造方法,但是可以通过super关键字访问父类的构造方法 继承 要体现子类父类的 继承关系, ”i ...

  2. MySQL 5.7安装(linux)

    https://blog.csdn.net/li_Dijkstra/article/details/79354385 https://blog.csdn.net/li_Dijkstra/article ...

  3. nginx入门(一)

    什么是nginx? nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5 ...

  4. 微信小程序request(ajax)接口请求封装

    微信小程序request(ajax)接口请求封装 最近在进行小程序的编写,需要调用后端接口,经常要用到wx.request方法,所以就自己封装了一下,简化一下代码,如果能给大家提供帮助更好,在封装的时 ...

  5. Docker备份与迁移

    容器保存为镜像 通过以下命令将容器保存为镜像: docker commit [-m="提交的描述信息"] [-a="创建者"] 容器名称|容器ID 生成的镜像名 ...

  6. nodejs http服务器简单搭建

    var http = require('http') // 1. 创建 Server var server = http.createServer() // 2. 监听 request 请求事件,设置 ...

  7. CF429E Points and Segments

    链接 CF429E Points and Segments 给定\(n\)条线段,然后给这些线段红蓝染色,求最后直线上上任意一个点被蓝色及红色线段覆盖次数之差的绝对值不大于\(1\),构造方案,\(n ...

  8. 苹果IOS 12将使您的iPhone更安全,并有更强大的黑客保护

    一年一度的IOS刷新正在进行中,苹果已经预览了它,beta测试者已经安装了它,当iPhone在9月份到货时我们其他人应该获得iOS12.虽然软件3-D表情符号和屏幕时间限制等功能在软件到货时可能会受到 ...

  9. Fabric的使用总结

    环境说明 建议python版本:2.7 fabric版本:最新版(当前为1.10.2) fabric安装 通过pip.py的方式安装(详细可以在fabric官网了解) fabric执行py文件的方法, ...

  10. hdu 6205: card card card【输入挂】

    题目链接 感谢 http://blog.csdn.net/txgang/article/details/77568491 以下供参考 getchar读入法 2683MS FastIO法 MX=1e2 ...