poj 3903 LIS
2016-05-14 20:15
183 查看
此题有毒,请准备好解药
一看,(⊙v⊙)嗯不错,这不是LIS嘛,再看数据,(:зゝ∠)呵呵,n^2打死都过不了,nlgn还差不多 >o<
所以呢再次介绍一种新的方法,这种神奇的方法无法告诉你LIS究竟是啥,但是可以知道他的长度~(≧▽≦)/~
先看代码再解释吧( ⊙o⊙ )
每次输入一个数,就在已有的序列中找到第一个比他大或等于他的数,覆盖掉,最后输出最终序列的长度即可
为什么呢( ⊙o⊙?)
我们有当前最终序列b
b1代表原序列中长度为1的所有上升子序列中的最小末尾数字
以此类推,bn就代表原序列中长度为n的所有上升子序列中的最小末尾数字
~(≧▽≦)/~啦啦啦
那么算法的正确性就显而易见啦
by >o< neighthorn
一看,(⊙v⊙)嗯不错,这不是LIS嘛,再看数据,(:зゝ∠)呵呵,n^2打死都过不了,nlgn还差不多 >o<
所以呢再次介绍一种新的方法,这种神奇的方法无法告诉你LIS究竟是啥,但是可以知道他的长度~(≧▽≦)/~
先看代码再解释吧( ⊙o⊙ )
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn=100000+10; int n,integer[maxn]; int main(){ while(scanf("%d",&n)!=EOF){ memset(integer, 0x3f, sizeof(integer)); for (int i = 0, x; i < n; i++) { cin >> x; *lower_bound(integer, integer + n, x) = x; } cout << lower_bound(integer, integer + n, 0x3f3f3f3f) - integer<<endl; } return 0; }
每次输入一个数,就在已有的序列中找到第一个比他大或等于他的数,覆盖掉,最后输出最终序列的长度即可
为什么呢( ⊙o⊙?)
我们有当前最终序列b
b1代表原序列中长度为1的所有上升子序列中的最小末尾数字
以此类推,bn就代表原序列中长度为n的所有上升子序列中的最小末尾数字
~(≧▽≦)/~啦啦啦
那么算法的正确性就显而易见啦
by >o< neighthorn
相关文章推荐
- 二十岁出头,你一无所有,但你却拥有一切
- 理解有参构造器和无参构造器的作用
- java nio
- IP聚合
- 软件工程课程前三次作业总结
- 获取fragment中对应的控件的写法
- mybatis分页插件
- compareTo返回值为-1 、 1 、 0 的排序问题
- C++builder Property属性
- HTML 5实现图像走马灯效果
- Java和C语言,C++语言主要差别
- 简单导航页采用ViewPage实现的原理
- 订制属于你的Fiddler
- CodeForces 599C Day at the Beach
- sort之结构体排序2
- codevs线段树练习5(双重标记)
- 获取fragment中的控件的写法
- 第二章笔记
- Js判断参数(String,Array,Object)是否为undefined或者值为空
- Swift 学习2