問題
最長遞增子數列(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;
}