最长递增子数列(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;
}

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