zoukankan      html  css  js  c++  java
  • 计蒜客 最长不下降子序列 (贪心+二分nlogn算法)

    最长不下降子序列

    题目链接:https://nanti.jisuanke.com/t/248

    题目:

    求最长不下降子序列的长度

    第一行为n,表示n个数 第二行n个数

    最长不下降子序列的长度

    N小于5000 for  each  num  < =maxint

    样例输入

    3
    1 2 3
    

    样例输出

    3
    思路:可以用O(n*n)做,就刚学贪心+二分nlogn的做法,所以这里就试了一下nlogn做法,即采用lower_bound,维护单调数组,
    对于序列 a(1, 7, 3, 5, 9, 4, 8),dp的变化过程如下:
    • dp[0] = a[0] = 1,长度为1的LIS结尾元素的最小值自然没得挑,就是第一个数。 (dp = {1})
    • 对于a[1]=7,a[1]>dp[0],因此直接添加到dp尾,dp[1]=a[1]。(dp = {1, 7})
    • 对于a[2]=3,dp[0]< a[2]< dp[1],因此a[2]替换dp[1],令dp[1]=a[2],因为长度为2的LIS,结尾元素自然是3好过于7,因为越小这样有利于后续添加新元素。 (dp = {1, 3})
    • 对于a[3]=5,a[3]>dp[1],因此直接添加到dp尾,dp[2]=a[3]。 (dp = {1, 3, 5})
    • 对于a[4]=9,a[4]>dp[2],因此同样直接添加到dp尾,dp[3]=a[9]。 (dp = {1, 3, 5, 9})
    • 对于a[5]=4,dp[1]< a[5]< dp[2],因此a[5]替换值为5的dp[2],因此长度为3的LIS,结尾元素为4会比5好,越小越好嘛。(dp = {1, 3, 4, 9})
    • 对于a[6]=8,dp[2]< a[6]< dp[3],同理a[6]替换值为9的dp[3],道理你懂。 (dp = {1, 3, 4, 8})
    这样子dp数组就维护完毕,所求LIS长度就是dp数组长度4。 
    AC代码如下:

    //
    // Created by hanyu on 2019/8/9.
    //
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <set>
    #include<math.h>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=1000+7;
    #define MAX 0x3f3f3f3f
    int main()
    {
        int a[maxn],dp[maxn];
        int n;
        while(~scanf("%d",&n))
        {
            memset(a,0,sizeof(a));
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                dp[i]=MAX;//dp初始化最大值
            }
            int pos=0;//dp数组最后一位下标
            dp[0]=a[0];
            
            for(int i=1;i<n;i++)
            {
                if(a[i]>=dp[pos])
                    dp[++pos]=a[i];
                else
                    dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i];
            }
            printf("%d
    ",pos+1);
        }
        return 0;
    }


  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11326548.html
Copyright © 2011-2022 走看看