LIS(最长的序列)和LCS(最长公共子)总结
LIS(最长递增子序列)和LCS(最长公共子序列)的总结
最长公共子序列(LCS):O(n^2)
两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2)
s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1;
s1[i - 1] != s2[j - 1], dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]);
初始化:dp[i][0] = dp[0][j] = 0;
伪代码:
dp[maxn1][maxn2];
s1[maxn1],s2[maxn2];
p[maxn1][maxn2][2];
//init
for i in range(0, len1):
dp[i][0] = 0;
else:;
for i in range(0, len2):
dp[0][i] = 0;
else:;
for i in range(1, len1):
for j in range(1, len2):
if s1[i] == s2[j]:
dp[i][j] = dp[i - 1][j - 1] + 1;
p[i][j][0] = i - 1;
p[i][j][1] = j - 1;
else:
if dp[i - 1][j] > dp[i][j - 1]:
dp[i][j] = dp[i - 1][j];
p[i][j][0] = i - 1;
p[i][j][1] = j;
else:
dp[i][j] = dp[i][j - 1];
p[i][j][0] = i;
p[i][j][1] = j - 1;
else:;
else:;
return dp[len1][len2];
//path 非递归
function print_path(len1, len2):
if (dp[len1][len2] == 0)
return;
printf_path(p[len1][len2][0], p[len1][len2][1]);
if s1[len1] == s2[len2]:
printf:s1[len1];
end function;
题目:UVA - 531Compromise
UVA - 10066The Twin Towers UVA - 10192Vacation
uva10405 - Longest Common Subsequence
最长递增子序列(LIS):O(n^2)
从左到右的求前i长度的序列的最长递增子序列的长度,状态转移方程:
dp[i] = Max(dp[j] + 1);i in range(1, len); j in range(1, i - 1);
伪代码
s[maxn],dp[maxn];
for i in range(1, len):
dp[i] = 1;
int maxlen = 1;
for i in range(2, len):
for j range(1, i - 1):
if s[i] > s[j]:
dp[i] = Max(dp[i], dp[j] + 1);
else:
maxlen = max(maxlen, dp[i]);
else:;
return maxlen;
//path递归
function print_path(maxlen):
if maxlen == 0:return;
for i in range(1, len):
if dp[i] == maxlen:
print_path(maxlen - 1);
printf:s[i];
end function;
最长递增子序列O(n * logn)
还是从左往右的求前i长度的序列的最长递增子序列长度,可是再确定dp[j]最大值的时候还要用一层循环来查找。这样比較低效.假设把前面的i长度序列出现的最长递增子序列储存起来,那么查找的时候用二分就能够做到O(logn)的复杂度。
用一个LIS数组来储蓄前i序列的最长递增子序列,查找第i个数字的时候,假设num[i] > LIS[top], 那么LIS[++top] = num[i]; dp[i] = top;假设num[i] == LIS[top],那么dp[i] = top; 假设num[i] < LIS[top], 那么二分查找到某个等于或者大于num[i]的最接近的值的位置(第k个),dp[i] = k - 1; LIS[k] = num[i];
伪代码
dp[maxn], LIS[maxn], s[maxn];
top = 0;
LIS[top++] = s[1];
int maxlen = 1;
for i in range(2, len):
if s[i] > LIS[top]:
LIS[++top] = s[i];
dp[i] = top + 1;
else if s[i] == LIS[top]:
dp[i] = top + 1;
else:
k = lower_bound(LIS.begin(), LIS.end(), s[i]) - LIS.beign();
LIS[k] = s[i];
dp[i] = k + 1;
maxlen = max(maxlen, dp[i]);
else:;
return maxlen;
最长公共子序列O(n * logn)
要求串本身不会出现同样的数字或是字母。通过对第一个字符串进行映射(递增的顺序)。然后第二个字符串按照上面的第一个字符串等价映射,这样就把问题从LCS转化成LIS。比如:
串1: 2 4 3 5 6
映射:1 2 3 4 5
串2: 3 2 6 8 10
等价映射:3 1 5 0 0
题目:uva10635Prince and Princess
版权声明:本文博客原创文章,博客,未经同意,不得转载。
LIS(最长的序列)和LCS(最长公共子)总结的更多相关文章
- [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二
Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...
- 最长上升序列 LCS LIS
子序列问题 (一)一个序列中的最长上升子序列(LISLIS) n2做法 直接dp即可: ;i<=n;i++) { dp[i]=;//初始化 ;j<i;j++)//枚举i之前的每一个j ) ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- (LIS)最长上升序列(DP+二分优化)
求一个数列的最长上升序列 动态规划法:O(n^2) //DP int LIS(int a[], int n) { int DP[n]; int Cnt=-1; memset(DP, 0, sizeof ...
- XHXJ's LIS HDU - 4352 最长递增序列&数位dp
代码+题解: 1 //题意: 2 //输出在区间[li,ri]中有多少个数是满足这个要求的:这个数的最长递增序列长度等于k 3 //注意是最长序列,可不是子串.子序列是不用紧挨着的 4 // 5 // ...
- HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列
题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d. 分析: 1.线段树 由于给定的元素的取值范围为0-10^5,因此维护一棵线段树 ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
- LCS最长公共子序列
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X= ...
- POJ 2250(LCS最长公共子序列)
compromise Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...
- HTTP 错误 500.19 – Internal Server Error web.config 文件的 system.webServer/httpErrors 节中不允许绝对物理路径“C:\inetpub\custerr”[转]
给ASP或者ASP.NET等需要配置IIS服务器的过程中,很可能会遇到以下两种错误.尤其是用Win7系统的,配置IIS7.0版本比用XP系统配置IIS5.1版本而言要复杂复杂一些.当同时需要配置ASP ...
- word2vec 中的数学原理具体解释(一)文件夹和前言
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包.它简单.高效.因此引起了非常多人的关注. 因为 word2vec 的作者 Tomas ...
- C#压缩与解压
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 基于visual Studio2013解决C语言竞赛题之1070删除相同节点
题目 解决代码及点评 /************************************************************************/ /* ...
- 十天学习PHP之第三天
1)按右边的结构:查看改动表结构 2)按右边的浏览:查看表中的数据 3)按右边的SQL:执行SQL语句 4)按右边的插入:插入一行记录 5)按右边的清空:删除表中全部记录 6)按右边的删除: ...
- 远光软件ASP.NET笔试题小汇总
ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据 ...
- WinExec函数,启动其他应用程序
WinExec The WinExec function runs the specified application. Note This function is provided only fo ...
- MFC的消息机制
MFC的消息循环(::GetMessage,::PeekMessage)消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情 分两个步骤完成: 1 “ ...
- 让动态创建的ActiveX控件响应Windows消息
当我们通过 CWnd::CreateControl() 动态创建 ActiveX 控件时, Windows 消息并不会被发送给我 们的由 CWnd 派生得控件类.例如,即使我们为 WM_KIL ...