LIS (nlogn)的算法
len[ i ] 代表长度为i的子串的最小结尾的数
#include<stdio.h> #include<algorithm> using namespace std; int a[100000]; int len[100000]; int main() { int n,i; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); int number=0; for(i=1;i<=n;i++) { if(i==1) len[++number]=a[i]; else if(a[i]>len[number]) len[++number]=a[i]; else { int temp=lower_bound(len+1,len+number+1,a[i])-len; len[temp]=a[i]; } } printf("%d\n",number); } return 0; }