最长上升子序列模版
Posted charlesss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长上升子序列模版相关的知识,希望对你有一定的参考价值。
动规基础部分,不废话了看代码肯定能懂
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100010; int n,a[maxn],f[maxn],ans,min; int check(int k,int l,int r)//二分查找函数,避免超时 { while(l<r) { int mid=(l+r)>>1; if(k>=f[mid]) l=mid+1; else r=mid; } return l; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",a+i); f[1]=a[0]; for( int i=1;i<n;i++) { if(f[ans]<a[i]) min=++ans;//如果当前数比子序列最后一数大,满足递增接在后面即可 else min=check(a[i],1,ans+1);//否则进行二分查找找到第一个比当前数更小的数,替换该数后的数 f[min]=a[i]; } printf("%d ",n-ans);//用原数列长度减去最长子序列长度,即为需要剔除的数的数目 return 0; }
以上是关于最长上升子序列模版的主要内容,如果未能解决你的问题,请参考以下文章