最长上升子序列
Posted xiaoyezi-wink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长上升子序列相关的知识,希望对你有一定的参考价值。
http://west14.openjudge.cn/20190430/02/
最长上升子序列
我们可以设最长上升子序列的长度为len
d[len]表示长度为len的最长上升子序列里最后一个数
当然,边界条件为
len=1
d[len]=a[1];
从第二个枚举所给序列的所有元素
设当前为i
当a[i]比d[len]小的时候,就加入到d数组,更新len和队尾
否则,如果a[i]!=d[len]
那就找到队列中第一个大于等于a[i]的数,用a[i]替代它,因为a[i]比原来的更有潜力形成一个新的最长上升子序列
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<cmath> using namespace std; int n,a[100005],len=1,d[100005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); d[len]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>d[len]) d[++len]=a[i]; else { if(a[i]!=d[len]) { d[lower_bound(d+1,d+len+1,a[i])-d] =a[i];//返回一个迭代器 } } } cout<<len; return 0; }
以上是关于最长上升子序列的主要内容,如果未能解决你的问题,请参考以下文章