您的位置:首页 > 其它

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

2013-11-04 20:13 225 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: