http://poj.org/problem?id=3903
这个题目是一个求最长递增子序列,这个只是求长度而已,所以可以用LIS
所谓的LIS也就是用二分优化来减少时间而已,而且其只能求出最长的序列,但其所包含的并不是最长的序列
#include <iostream> #include <stdio.h> using namespace std; int a[100005],dp[100005]; int main() { int n; while(scanf("%d",&n)>0) { for(int i=0;i<n;i++) scanf("%d",&a[i]); dp[0]=a[0]; int len=1; for(int i=1;i<n;i++) { int left=0,right=len-1,mid; if(a[i]>dp[len-1]) dp[len++]=a[i]; else{ right=len-1; while(left<=right) { mid=(left+right)/2; if(dp[mid]<a[i]) left=mid+1; else right=mid-1; } dp[left]=a[i]; } } printf("%d ",len); } return 0; }