给n个数求最长非下降子序列
这个题思路就是遍历一次所以,每次判断后面一个与前面一个的大小,如果比前面所求的序列的最后一个数小,这个序列按升序依次记录,用j=upper_bound(f+1,f+cnt+1,a[i])-f;这个寻找到这个序列中第一个大于这个数的下标,然后替换成这个数,这样就能找到最长的不下降子序列了,代码如下
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define me(x,b) memset(x,b,sizeof(x))
#define lowbit(x) x&(-x)
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int main()
{
int f[maxn],a[maxn];
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{scanf("%d",&a[i]);
}
f[1]=a[1];//初始化
int cnt=1;
for(int i=2;i<=n;i++)
{
if(a[i]>=f[cnt]) f[++cnt]=a[i];//不下降可以等于
else
{
int j=upper_bound(f+1,f+cnt+1,a[i])-f;//这是核心重点
f[j]=a[i];
}
}
printf("%d\n",cnt);
return 0;
}