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);
}