最長遞增子數列(LIS)



問題

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章