共计 664 个字符,预计需要花费 2 分钟才能阅读完成。
题目
一个数的序列 b_i,当 b_1<b_2<...<b_S 的时候,我们称这个序列是上升的。对于给定的一个序列 (a_1, a_2, ..., a_N),我们可以得到一些上升的子序列 (a_{i1}, a_{i2}, ..., a_{iK}),这里 1 \le i_1, 1 \le i_2, ..., 1 \le i_k \le N。比如,对于序列 (1,7,3,5,9,4,8),有它的一些上升子序列,如 (1,7),(3,4,8) 等等。这些子序列中最长的长度是 4,比如子序列 (1,3,5,8)。
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入描述
输入的第一行是序列的长度 N (1 \le N \le 1000)。第二行给出序列中的 N 个整数,这些整数的取值范围都在 0 到 10000。
输出描述
最长上升子序列的长度。
样例
输入:
7
1 7 3 5 9 4 8
输出:
4
题解
#pragma GCC optimize(3,"Ofast","inline")
#include<cstdio>
#include<algorithm>
using namespace std;
int *a, *f, l, ans=0, i, j;
int main()
{scanf("%d", &l);
a = new int[l];
f = new int[l];
for (i = 0; i < l; ++i)
{scanf("%d", a + i);
j = lower_bound(f, f + ans + 1, a[i]) - f; //STL
f[j] = a[i];
ans = max(ans, j);
}
printf("%d", ans);
return 0;
}
正文完