问题
最长递增子数列(LIS)
子数列(Subsequence)指的是某个数列上保持本身的顺序,只选择其中一部分项来构成的数列。比如说有[1,3,2,4]构成的数列,其中 [1,3,4], [1,2,4]等会成为子数列,但[1,2,3]不能成为子数列。
最长递增子数列(Longest IncreasingSubsequence)指的是某个数列的子数列中,各项比之前项递增的子数列。比如说给出的数列 [1,8,4,12,2,14,6] 的最长递增子数列有[1,8,12,14], [1,4,12,14]。
当给出数列时,请求一下相关数列的最长递增子数列的长度。
输入
第一行给出数列的长度N。(1≤N≤300,000)
第二行按顺序给出数列的各项的值。给出的数字是32bit整数型以内的数字。
输出
第一行输出,给出的数列中,最长递增数列的长度。
案例输入
10
1 1 2 2 3 3 2 2 5 5
案例输出
4
#include<cstdio>
#include<cstring>
const int maxn = 500001;
int n, a[maxn], b[maxn];
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(b, 0, sizeof(b));
b[1] = 1;
int maxa = 1;
for (int i = 2; i <= n; i++){
int maxb = 1;
for (int j = 1; j < i; j++){
if (a[j] < a[i]){
if ((b[j] + 1) > maxb) maxb = b[j] + 1;
}
}
b[i] = maxb;
if (maxb > maxa) maxa = maxb;
}
printf("%d", maxa);
return 0;
}