http://poj.org/problem?id=2533
Time Limit: 2000MS | Memory Limit: 65536K | |
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
/* Author : yan * Question : POJ 2533 Longest Ordered Subsequence * Date && Time : Monday, January 24 2011 10:21 AM * Compiler : gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 */ #include<stdio.h> #define MAX 10001 int n; int value[MAX];//原始数组 int opt[MAX+1];//记录长度为k的LIS的最后元素 int binary_search(const int opt[],const int size,const int value) { int left=1; int right=size; int mid; while(left<=right) { mid=(left+right)>>1; if(value>opt[mid] && value<=opt[mid+1]) return mid+1; else if(value<opt[mid+1]) right=mid-1; else left=mid+1; } } int LIS(const int value[],const int n) { int i,j; int size=1; opt[1]=value[0]; for(i=1;i<n;i++) { if(value[i]<=opt[1]) j=1; else if(value[i]>opt[size]) j=++size; else j=binary_search(opt,size,value[i]); opt[j]=value[i]; } return size; } int main() { //freopen("input","r",stdin); int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&value[i]); printf("%d",LIS(value,n)); return 0; }