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;
}

 

posted @ 2013-08-09 22:58  SprayT  阅读(204)  评论(0编辑  收藏  举报