O(nlogn)实现LCS与LIS
序:
LIS与LCS分别是求一个序列的最长不下降序列序列与两个序列的最长公共子序列。
朴素法都可以以O(n^2)实现。
LCS借助LIS实现O(nlogn)的复杂度,而LIS则是通过二分搜索将复杂度从n^2中的朴素查找导致的n降至logn使之整体达到O(nlogn)的复杂度。
具体解析:
http://www.cnblogs.com/waytofall/archive/2012/09/10/2678576.html
LIS代码实现:
/*
About: LIS O(nlogn)
Auther: kongse_qi
Date:2017/04/26
*/
#include <bits/stdc++.h>
#define maxn 10005
using namespace std;
int n, x[maxn];
void Init()
{
scanf("%d", &n);
for(unsigned i = 0; i != n; ++i)
{
scanf("%d", &x[i]);
}
return ;
}
int lower_find(int cur, int t, int x[])
{
int l = 0, r = t, mid;
while(l < r-1)
{
mid = (l+r)/2;
if(x[mid] > cur) r = mid;
else l = mid+1;
}
return (x[l] >= cur ? l : r);
}
int Lis()
{
int dp[maxn], top_pos = -1, pos;
dp[++top_pos] = x[0];
for(unsigned i = 1; i != n; ++i)
{
if(x[i] > dp[top_pos])
{
dp[++top_pos] = x[i];
continue;
}
pos = lower_find(x[i], top_pos, dp);//手写或直接调用STL的lower_bound函数寻找下界
//pos = lower_bound(dp, dp+top_pos+1, x[i])-dp;
if(dp[pos] > x[i]) dp[pos] = x[i];
}
return top_pos+1;
}
int main()
{
freopen("test.in", "r", stdin);
Init();
printf("%d\n", Lis());
return 0;
}
LCS代码实现
/*
About: LCS O(nlogn)
Auther: kongse_qi
Date:2017/04/26
*/
#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
int n, m, a[maxn], b[maxn];
vector<int> x[maxn];
vector<int> dp;
typedef vector<int>::iterator iterator_t;
void Init()
{
scanf("%d%d", &n, &m);
for(unsigned i = 0; i != n; ++i)
{
scanf("%d", &a[i]);
}
for(unsigned i = 0; i != m; ++i)
{
scanf("%d", &b[i]);
}
return ;
}
void Pre()
{
for(unsigned i = m-1; i != -1; --i)
{
x[b[i]].push_back(i);
}
for(unsigned i = 0; i != n; ++i)
{
if(!x[a[i]].empty())
{
for(iterator_t j = x[a[i]].begin(); j != x[a[i]].end(); ++j)
{
dp.push_back(*j);
}
}
else dp.push_back(0);
}
return ;
}
int Lis()
{
int qi[maxn], top_pos = -1, pos;
qi[++top_pos] = dp[0];
for(iterator_t i = dp.begin()+1; i != dp.end(); ++i)
{
if(*i > qi[top_pos])
{
qi[++top_pos] = *i;
continue;
}
pos = lower_bound(qi, qi+top_pos+1, *i)-qi;
if(qi[pos] > *i) qi[pos] = *i;
}
return top_pos+1;
}
int main()
{
//freopen("test.in", "r", stdin);
Init();
Pre();
printf("%d\n", Lis());
return 0;
}
自此结束。
箜瑟_qi 2017.04.26 9:01
O(nlogn)实现LCS与LIS的更多相关文章
- 最长公共子序列-LCS问题 (LCS与LIS在特殊条件下的转换) [洛谷1439]
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出 一个数,即最长公共子序列的长度 输入样例 5 ...
- BZOJ4990 (LCS转LIS)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4990 分析 首先可以看出一个简单的DP dp[i][j]表示序列a前i个与序列b前j个连线数 ...
- uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))
标题效果:有两个长度p+1和q+1该序列.的各种元素的每个序列不是相互同.并1~n^2之间的整数.个序列的第一个元素均为1. 求出A和B的最长公共子序列长度. 分析:本题是LCS问题,可是p*q< ...
- UVa10635 - Prince and Princess(LCS转LIS)
题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 题解 这个是大白书上的例题,不过 ...
- BZOJ1264 [AHOI2006]基因匹配Match 【LCS转LIS】
题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\( ...
- uva 10635 LCS转LIS
这道题两个数组都没有重复的数字,用lcs的nlogn再适合不过了 #include <iostream> #include <string> #include <cstr ...
- LCS&&LRC&&LIS问题
注:最近笔试题经常碰到DP动态规划的问题,但是由于本人没有接触过DP,笔试后看到别人家的答案简洁又漂亮,真的羡慕:难的DP自己可能不会,那再见到常见的LCS和LRS以及LIS为问题总该会吧: 资料参考 ...
- 算法心得1:由$nlogn$复杂度的LIS算法引起的思考
LIS(Longest Increasing Subsequence)是一类典型的动态规划类问题,简化描述如下: 给定$N(n) = \{1,2...,n\}$的一个排列$P(n)$,求$P(n)$中 ...
- BZOJ 1264 基因匹配Match(LCS转化LIS)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列 ...
随机推荐
- shell 之时间戳
vim 1.sh #/bin/bash##by cc read -p "Please input yourtime:" timea=$timeif [ $a != 0 ] then ...
- cuda编程学习4——Julia
书上的例子编译会有错误,修改一下行即可. __device__ cuComplex(float a,float b):r(a),i(b){} /* ========================== ...
- 说说JAVA之网络编程 - 爬虫
首先总结一下学习过程中所需要的类: URL类 - openConnection() URLConnection类 - connection() getInputStream() BufferedRea ...
- 用C写一个web服务器(二) I/O多路复用之epoll
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- dxxzc团队及队员学号后三位
队名:dxxzc团队 组长:邢正080 组员:董冰068 许国庆079 张琦057 曹华058
- pg_config executable not found
Error: pg_config executable not found. Please add the directory containing pg_config to the PATH or ...
- c++内存优化:二级间接索引模式内存池
/********************************************************* 在一些不确定内存总占用量的情形下,频繁的使用new申请内存,再通过链表 进行索引似 ...
- 手机自动化测试:appium问题解决
手机自动化测试:appium问题解决 Appium遇到问题: 问题一:问题org.openqa.selenium.remote.UnreachableBrowserException: Could ...
- Android自定义View之音频条形图
2016-04-12 17:52 76人阅读 评论(2) 收藏 举报 分类: Android(26) 版权声明:本文为博主原创文章,未经博主允许不得转载. 新建项目,新建MusicRectangl ...
- Unix文件 I/O(不带缓冲区的)上
简介 Unix系统大多数文件i/o只需要:open.read.write.lseek.close这几个函数.但是某些时候我们也需要fcntl.ioctl.sync等函数配合使用.这些函数都是不带缓冲区 ...