标签:targe tar include 最长上升子序列 条件 ++ string using .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; }
标签:targe tar include 最长上升子序列 条件 ++ string using .com
原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10797740.html