最长子序列长度(LIS)--个数遍历的二分+贪心优化
B3637 最长上升子序列 - 洛谷
#include<bits/stdc++.h>
#include<string>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> pii;
int n;
int g[N];
int dp[N];
int ma=0;
int main()
{
cin>>n;
memset(g,0x3f,sizeof(g));///g[i]记录是子序列为i-1(主要从0开始)时 的最小值
for(int i=1;i<=n;i++)
{int x;cin>>x;int pos=lower_bound(g,g+n,x)-g;///找到第一个>=x的位置///则pos-1是小于x的,则x就是pos这个子序列长度的当前最小值 g[pos]=x;dp[i]=pos+1;///dp[i]以第i个数结尾的最长子序列长度 ma=max(pos+1,ma);
}
cout<<ma;
return 0;
}