poj 2533 o(nlgn)做法

来源:互联网 发布:淘宝银饰品店铺介绍 编辑:程序博客网 时间:2024/05/17 21:54

反正这个很奇妙,感觉不像是动态规划了……

一个数组记录原来序列,一个数组记录长度为i的最长上升序列的结尾值是多少。

因为查找的是时候是二分查找,所以平均复杂度由传统的O(n^2)变成了O(nlogn).微笑

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int maxn=5e4+10;int num[maxn];int n;const int inf=1e9+10;int value[maxn];//长度为i的最长上升序列的结尾值是多少。int main(){while(scanf("%d",&n)==1&&n)    {        fill(value,value+n+1,inf);        //memset(value,0x3f,sizeof(value));                for(int i=1;i<=n;i++) scanf("%d",&num[i]);        int ans=-1;        for(int i=1;i<=n;i++)        {            int len=lower_bound(value+1,value+1+n,num[i])-value;//取其长度            if(ans<len)//更新ans                ans=len;            value[len]=num[i];        }        printf("%d\n",ans);    }}

原创粉丝点击