#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[100005], c[100005];
int find(int low, int high, int x){
while(low < high){
int mid = (high + low) / 2;
if(x < c[mid])
high = mid;
else
low = mid + 1;
}
return low;
}
int main(){
int n;
while(~scanf("%d", &n)){
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int len = 0;
c[0] = a[0];
for(int i = 1; i < n; i++){
if(a[i] > c[len]){
c[++len] = a[i];
}
else{
int w = find(0, len, a[i]);
c[w] = a[i];
}
}
printf("%d\n", len + 1);
}
return 0;
}
15-最长上升子序列(二分)
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
中国人民解放军建军97周年
缅怀先烈,砥砺前行付吾辈之韶华,耀吾辈之中华! 万里河山,有您心安!
中国人民解放军建军97周年