zoukankan      html  css  js  c++  java
  • 最长上升子序列模版

    传送门

    动规基础部分,不废话了看代码肯定能懂

    #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;
    }
  • 相关阅读:
    mysql日志
    验证栈序列
    限流方案分析
    集合
    数据结构-树
    链表的中间节点
    PHP实现链表
    php扩展安装方式
    2017 Multi-University Training Contest
    用LCT解一类动态图的问题
  • 原文地址:https://www.cnblogs.com/charlesss/p/10290481.html
Copyright © 2011-2022 走看看