题目概述
给定N个数num,求其最长上升子序列长度
时限
1000ms/2000ms
输入
第一行正整数times,代表数据组数,每组数据第一行正整数N,其后N行,每行正整数num
限制
1<=N<40000
输出
每行一个数,最长上升子序列长度
样例输入
4
6
4
2
6
3
1
5
10
2
3
4
5
6
7
8
9
10
1
8
8
7
6
5
4
3
2
1
9
5
8
9
2
3
1
7
4
6
样例输出
3
9
1
4
讨论
dp,最长上升子序列长度,显然题目不是这么描述的,不过和hdu 1025几乎是一致的类型,于是这里就直接把模型写上了
只是数据略大,加上借用了stl,因而慢了一些
题解状态
62MS,1576K,702 B,G++
题解代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 40003
#define memset0(a) memset(a,0,sizeof(a))
#define EPS 1e-6
int N;//数字总数
int stk[MAXN], top;//stack 模拟栈及其栈顶
int fun()
{
scanf("%d", &stk[top++]);//input//吞进去第一个数使栈非空
for (int p = 1; p < N; p++) {
int num;
scanf("%d", &num);//input
if (num > stk[top - 1])
stk[top++] = num;
else
*lower_bound(stk, stk + top, num) = num;
}
return top;
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
int times;
scanf("%d", ×);//input
while (times--) {
scanf("%d", &N);//input
printf("%d\n", fun());//output
memset0(stk);
top = 0;
}
}
EOF