2097 LIS

来源:互联网 发布:unity3d ui 动画 编辑:程序博客网 时间:2024/05/17 05:09
描述

输入n个整数,a1,a2,...,an
求它的LIS(最长不降子序列)长度。

输入

多组测试数据,每组占两行,第一行是一个整数n(1<=n<=50),第二行有n个整数,表示a1,...,an. (0<=ai<=100000)

输出

输出这n个整数的LIS长度。

样例输入
3
1 3 3
3
5 2 1
样例输出
3
1
模拟题
#include <iostream>#include <string>using namespace std;const int N = 1001;int a[N], C[N], f[N]; // f[i]用于记录a[0i]的最大长度int bsearch(const int *C, int size, const int &a) {int l=0, r=size-1;while( l <= r ) {int mid = (l+r)/2;if( a >= C[mid-1] && a < C[mid] ) return mid; // >&&<= 换为: >= && <else if( a < C[mid] ) r = mid-1;else l = mid+1;}}int LIS(const int *a, const int &n){int i, j, size = 1;C[0] = a[0]; f[0] = 1;for( i=1; i < n; ++i ){if( a[i] < C[0] ) j = 0;                 // <= 换为: <else if( a[i] >=C[size-1] ) j = size++;   // > 换为: >= else j = bsearch(C, size, a[i]);C[j] = a[i]; f[i] = j+1;}return size;}int main(void){int data[32];int n;while(cin>>n){for(int i=0;i<n;i++)cin>>data[i];cout<<LIS(data,n)<<endl;}return 0;}


原创粉丝点击