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

    【题目描述】

    给定一个数列,询问此数列的LIS长度。

    【输入描述】

    第一行输入一个正整数n(n <= 100000),表示数列长度;

    第二行输入n个数,表示原始数列。

    【输出描述】

    输出一个数,表示答案。

    【输入样例】

    3

    3 1 2

    【输出样例】

    2

    源代码:
    
    #include<cstdio>
    int n,Ans=1,i[100001],Stack[100001];
    int Search(int T) //二分查找。
    {
        int Left=1,Right=Ans;
        while (Left<=Right)
        {
            int Mid=(Left+Right)>>1;
            if (T>Stack[Mid]&&T<=Stack[Mid+1])
              return Mid;
            else
              if (T>Stack[Mid])
                Left=Mid+1;
              else
                Right=Mid-1;
        }
        return 0;
    }
    int main() //O(nlogn)的神威!
    {
        scanf("%d",&n);
        for (int a=1;a<=n;a++)
          scanf("%d",&i[a]);
        int T;
        Stack[1]=i[1]; //Stack[]是一个单调栈。
        for (int a=2;a<=n;a++)
        {
            if (Stack[Ans]<i[a])
              T=++Ans;
            else
              T=Search(i[a])+1;
            Stack[T]=i[a];
        }
        printf("%d",Ans); //单调栈的长度即为LIS长度。
        return 0;
    }
    
    /*
        为什么这样是正确的呢?
        当无法更新单调栈长度时,将此元素的作用发挥到了最大——替换掉刚好比它大的那个数,其实这是一个贪心。
    */
  • 相关阅读:
    KINDLE 小说下载--超级书库
    修改PR Cs6,PS Cs6,AU Cs6的启动界面
    SQLMAP用户手册
    Burp Suite 实战指南--说明书
    XSS跨站测试代码
    万能密码字典
    python数据结构之队列(一)
    python数据结构之栈
    python实现链表(二)
    python实现链表(一)
  • 原文地址:https://www.cnblogs.com/Ackermann/p/6000280.html
Copyright © 2011-2022 走看看