[C++] 最长上升子序列

8次阅读
没有评论

共计 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 个整数,这些整数的取值范围都在 010000

输出描述

最长上升子序列的长度。

样例

输入:

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;
}
正文完
 0
元素
版权声明:本站原创文章,由 元素 于2024-11-19发表,共计664字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码