优化的最长上升子序列LIS算法 O(nlogn)

来源:互联网 发布:软件腰带剑开刃多少钱 编辑:程序博客网 时间:2024/06/04 18:01


g[ x ]  记录的是 :   g[ x ]  = min {  a[ i ]  |  以a[ i ] 结尾的最长上升子序列长度是 x },     若不存在这样的a[ i ]  , g[ x ] = INF

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=1010,INF=(int)1e9;int a[maxn] , d[maxn] ,g[maxn];int main(){    int n;    while(~scanf("%d",&n)){      for(int i=1;i<=n;i++) g[i] = INF;      int M=1;      for(int i=0;i<n;i++) scanf("%d",&a[i]);      for(int i=0;i<n;i++) {        int k= lower_bound(g+1,g+1+n,a[i]) - g;        d[i] = k;        g[k] = a[i];        M = max ( M , d[i]);      }      printf("%d\n",M);    }    return 0;}


原创粉丝点击