LIS 最长严格上升子序列问题
2017-05-25 19:41
399 查看
复习系列
dp做到O(n^2)
二分做到O(nlogn)
具体讲二分
用L[x]数组表示 长为x的序列末尾的数(也就是最大的)
容易得到 L数组单调上升
那么每次读入一个数a时 都可以在L数组里找到比a大的最小的位置
显然这个位置如果是a的话应该是更优的
那用a替换掉它
贴码
dp做到O(n^2)
二分做到O(nlogn)
具体讲二分
用L[x]数组表示 长为x的序列末尾的数(也就是最大的)
容易得到 L数组单调上升
那么每次读入一个数a时 都可以在L数组里找到比a大的最小的位置
显然这个位置如果是a的话应该是更优的
那用a替换掉它
贴码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<cstdlib> #include<cmath> #include<map> #include<set> #define ll long long using namespace std; ll read() { ll ans=0; bool b=1; char c=getchar(); while(!isdigit(c)) { if(c=='-')b=0; c=getchar(); } while(isdigit(c)) { ans=ans*10+(c-'0'); c=getchar(); } if(b)return ans; else return -ans; } int L[1000001],p; int main() { //ios::sync_with_stdio(false); int n=read(); for(int i=1;i<=n;i++) { int a=read(); int l=0,r=p,mid=(l+r)>>1; while(l<r) { mid=(l+r)>>1; if(a>L[mid])l=mid+1; else r=mid; } if(L[l]>=a)L[l]=a; else L[++p]=a; } cout<<p; return 0; }
相关文章推荐
- 最长上升子序列问题 (LIS)
- LIS 最长上升子序列问题 nlgn时间打印其中一个序列
- hdu 5421 小明系列问题——小明序列(LIS最长上升子序列)
- POJ - 3903 Stock Exchange(LIS最长上升子序列问题)
- LIS求解最长上升子序列问题
- Stock Exchange(LIS最长上升子序列问题)
- 最长上升子序列问题LIS
- 最长上升子序列(LIS)问题
- Longest Increasing Subsequence[LIS 最长上升子序列问题] (Longest Ordered Subsequence) POJ - 2533 队列优化
- 最经典的最长上升子序列问题【LIS】【垃圾死啦都】
- Leetcod-300_最长上升子序列LIS-基础动态规划问题-【C++】
- 关于最长上升子序列的问题(LIS)
- lis求最长上升子序列问题
- 动态规划-最长上升子序列(LIS)
- 最长上升子序列问题--题解
- LIS 最长单调上升子序列
- LIS 最长上升子序列N^2以及nlogn算法
- 最长上升子序列问题的几种解法
- LIS(最长上升子序列)
- 动态规划-最长上升子序列(LIS)