最长上升子序列(LIS)nlogn模板
参考https://www.cnblogs.com/yuelian/p/8745807.html
注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound
比如123458, 加入了5
假设求最长上升子序列
这个时候只能替换5,不能替换8(严格上升)
虽然没有用,但是这样不会错,写upper_bound就错了。
假设求最长不下降子序列
这样应该替换8,替换5并不是最优的
所以用upper_bound
最长上升子序列(LIS)nlogn模板
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 51234;
int a[MAXN], f[MAXN], n; //a数组从0开始,f数组从1开始
int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = a[0]; //初始化
REP(i, 1, n)
{
if(a[i] > f[len]) f[++len] = a[i]; //这里是++len 若是不下降就改为>=
else f[lower_bound(f + 1, f + len + 1, a[i]) - f] = a[i]; //注意f数组是从1开始
}
printf("%d\n", len);
return 0;
}
最长不下降子序列(LIS)nlogn模板
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 51234;
int a[MAXN], f[MAXN], n;
int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = a[0];
REP(i, 1, n)
{
if(a[i] >= f[len]) f[++len] = a[i]; //>改成>=
else f[upper_bound(f + 1, f + len + 1, a[i]) - f] = a[i]; //lower_bound改成upper_bound
}
printf("%d\n", len);
return 0;
}
如果要求最长下降子序列或者最长不上升子序列符号改变,同时二分加上cmp即可
另外有个神奇的定理
如果是求一个数组最少分成几组最长不上升子序列的话
答案就是最长上升子序列(上升改成下降也成立)
导弹拦截那题要用到
输出路径的版本,见https://blog.csdn.net/lxcxingc/article/details/81238008
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 51234;
int a[MAXN], f[MAXN];
int ans[MAXN], pos[MAXN], n;
int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = pos[1] = a[0];
REP(i, 1, n)
{
if(a[i] > f[len]) f[++len] = a[i], pos[i] = len;
else f[pos[i] = lower_bound(f + 1, f + len + 1, a[i]) - f] = a[i];
}
printf("%d\n", len);
int maxx = 1e9, t = len;
for(int i = n - 1; i >= 0; i--)
{
if(t == 0) break;
if(pos[i] == t && maxx > a[i])
{
maxx = a[i];
ans[t--] = a[i];
}
}
REP(i, 1, len + 1) printf("%d ", ans[i]);
puts("");
return 0;
}
最长上升子序列(LIS)nlogn模板的更多相关文章
- 动态规划——最长上升子序列LIS及模板
LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...
- 最长上升子序列 LIS nlogn
给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...
- AT2827 最长上升子序列LIS(nlogn的DP优化)
题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...
- nlogn 求最长上升子序列 LIS
最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...
- 最长递减子序列(nlogn)(个人模版)
最长递减子序列(nlogn): int find(int n,int key) { ; int right=n; while(left<=right) { ; if(res[mid]>ke ...
- 最长上升子序列LIS(51nod1134)
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...
- 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】
二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...
- 洛谷1439:最长公共子序列(nlogn做法)
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...
- 一个数组求其最长递增子序列(LIS)
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
随机推荐
- poj 2337 Catenyms 【欧拉路径】
题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...
- 对于startActivity的使用改进
传统方式 一直以来,使用startActivity的方式就是例如以下: 比方从AActivity跳转到BActivity.那么我们是在AActivity中这样去写: Intent intent = n ...
- Material Design学习之 Button(具体分析,传说中的水滴动画)
转载请注明出处:王亟亟的大牛之路 上一篇大致介绍了Material Design的一些基本概念传送门:http://blog.csdn.net/ddwhan0123/article/details/5 ...
- 【CTO辩论会】移动开发人员忠于技术or 背离技术
第一期CTO辩论会结束后,大家在微信群中讨论,学什么编程语言好.有位官人直呼"劳力者治于人,苦差,不学也罢". 在IT.科技变革世界的今天,移动开发人员成为一个很时髦的工种. 就连 ...
- 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(转)
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(转) 一.总结 一句话总结:.NET是一个平台,包含多种语言,比如(C#.Visual Basic.C++/C ...
- Windows PE 工具
通过大白菜.老毛桃等装机软件,然后制作 U 盘启动工具, 1. 什么是 windows pe 工具 PE(Preinstall Environment),Win pe 全称 Windows Prein ...
- Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写
转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...
- 35.自己实现vector模板库myvector
myvector.h #pragma once //自己写的vector模板库 template <class T> class myvector { public: //构造 myvec ...
- Android 代码中使用Color工具类 parseColor
方式一: arg1.setBackgroundColor(Color.parseColor("#87CEFA")); 方式二: arg1.setBackgroundColor(ge ...
- theano import error (win10 python2.7)
因为项目需要,在win10-64位电脑上配置theano.但是一直有 import error的错误,找不到解决方法.作为一个python新手,实在搞不定,请大家不吝赐教!小女子不胜感激! 按照网上的 ...