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次.求两个数列 ...
随机推荐
- 多线程——i++的坑
在使用socket编程的时候发生数据丢失问题,一直以为是网络原因,后来测试后发现是多线程操作同一数据源又未加入数据锁导致. 直接上代码,下面程序执行的结果可能出现198.199.200.两个线程统一时 ...
- Docker 跟 NodeJs 最佳实践
Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...
- [LeetCode] 01 Matrix 题解
题意 # 思路 我一开始的时候想的是嘴 # 实现 ```cpp // // include "../PreLoad.h" class Solution { public: /** ...
- 设计模式的征途—1.单例(Singleton)模式
单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...
- Unity3D Layer要点
简介 Layer可以用于光照的分层和物理碰撞的分层,这样可以很好地进行性能优化 数据结构 Layer在Unity中有3中呈现方式:1.string名字,2.int层索引 ...
- 【Java基础】 Java动态代理机制
在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...
- 无线接收信号强度(RSSI)那些事儿
本文由嵌入式企鹅圈原创团队成员黄鑫供稿. 本文所述的原理适用于所有无线传输技术,只是用蓝牙来举例.应该说,嵌入式企鹅圈更加偏重于嵌入式和物联网.安卓技术原理方面的知识分享和传播,其次才是实践,尽管很多 ...
- Windows运行命令大全
inetmgr 启动IIS控制台winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Wi ...
- 微信小程序首页总结
效果图如下 首先从大的方面来讲,就是设置了window的属性 "navigationBarBackgroundColor": "#AFE2E6",//bar ...
- jdk源码剖析:Synchronized
开启正文之前,先说一下源码剖析这一系列,就以"死磕到底"的精神贯彻始终,最少追踪到JVM指令(再往下C语言实现了). =========正文分割线=========== Sync ...