这虽然是一个提高题,但思路并不难
给定一个长度为 𝑁N 的数列,求数值严格单调递增的子序列的长度最长是多少。
这相当于先将a[0]赋值到b[++cnt]里,在比较能不能交换实现单调递增
有点类似于lowwer_bound
input
6
1 3 2 8 5 6
output
4
a[i]:1 3 2 8 5 6
b[i]:1 2 5 6
Code:
#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],cnt,b[100005];
int main()
{
cin>>n;
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
b[++cnt]=a[0];
for(int i=1;i<n;i++)
{
long long y=lower_bound(b+1,b+1+cnt,a[i])-b;
if(y>cnt) b[++cnt]=a[i];
else b[y]=a[i];
}
cout<<cnt;
return 0;
}