题目描述
对于一个整数序列 ,定义 的子序列为:从 中删除若干个元素后(允许不删,也允许将所有 个元素都删除),剩下的元素按照原来的顺序所组成的序列。如果这个子序列的元素从左到右严格递增,则称它为 的一个上升子序列。其中包含元素数量最多的上升子序列称为 的最长上升子序列。例如, 和 都是 的最长上升子序列,长度都为 。
那么,给定一个序列 , 求 的最长上升子序列的长度
输入格式
第一行一个整数 ,代表序列 的长度
第二行是 个由空格隔开的整数,代表
输出格式
一个整数,代表最长上升子序列的长度
测试样例
样例输入
7
2 1 1 4 7 5 6
样例输出
4
数据规模
对于 的数据,
#include <bits/stdc++.h>
using namespace std;
#define N 1000002
int n, a[N + 1], l[N];
int lis() {
l[0] = a[0];
int len = 1;
for (int i = 1; i < n; ++i) {
if (l[len - 1] < a[i])
l[len++] = a[i];
else
*lower_bound(l, l + len, a[i]) = a[i];
}
return len;
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
scanf(" %d", &a[i]);
cout << lis();
}
注:本题还可以用树状数组求解