lis有复杂度哦(n*log(n))的算法

实质就是维护一个答案序列 将每次更优的的放在应该在的地方

下面是求严格递增的lis

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int dp[100005];
int ans[100005];
int main()
{
    int cas=0;
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    ans[1]=a[1];
    int len=1;
    for(int i=2; i<=n; i++)
    {
        if(a[i]>ans[len])
        {
            ans[++len]=a[i];
        }
        else
        {
            int pos=lower_bound(ans+1,ans+1+len,a[i])-ans;
            ans[pos]=a[i];
        }
    }printf("%d\n",len);
}

 

附上求非严格递增的lis

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int dp[100005];
int ans[100005];
int main()
{
    int cas=0;
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    ans[1]=a[1];
    int len=1;
    for(int i=2; i<=n; i++)
    {
        if(a[i]>=ans[len])
        {
            ans[++len]=a[i];
        }
        else
        {
            int pos=upper_bound(ans+1,ans+1+len,a[i])-ans;
            ans[pos]=a[i];
        }
    }printf("%d\n",len);
}