1. 程式人生 > >最長上升子序列 二分優化寫法

最長上升子序列 二分優化寫法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1005
int a[maxn];
int d[maxn];
int n;
int len;
int find(int x)
{int l=1,r=len;
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(d[mid]>=x)
       r=mid;
       else
        l=mid+1;
    }
    return l;
}
int main()
{

    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    d[1]=a[1];
     len=1;
    for(int i=2;i<=n;i++)
      {

if(a[i]>d[len])
            d[++len]=a[i];
        else
        {
            int w=find(a[i]);
            d[w]=a[i];
        }
}
printf("%d\n",len);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1005
int a[maxn];
int d[maxn];
int n;
int len;

int main()
{

    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    d[1]=a[1];
     len=1;
    for(int i=2;i<=n;i++)
      {

if(a[i]>d[len])
            d[++len]=a[i];
        else
        {
            int w=lower_bound(d+1,d+len+1,a[i])-d;
            d[w]=a[i];
        }
}
printf("%d\n",len);
return 0;