hdu 1950

来源:互联网 发布:中国银行安全控件mac 编辑:程序博客网 时间:2024/06/07 15:57

题目概述

给定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-6int 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", &times);//input    while (times--) {        scanf("%d", &N);//input        printf("%d\n", fun());//output        memset0(stk);        top = 0;    }}

EOF

0 0
原创粉丝点击