文章目录

  • 不输出序列的思路
  • 输出序列
    • 代码
  • 例题:导弹拦截

不输出序列的思路

我们对于O(n2)O(n^2)O(n2)的最长不下降子序列十分熟悉了。

#include <bits/stdc++.h>
using namespace std;
int n,ans,a[1005],f[1005];int main() {scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=1;for(int i=n-1;i>=1;i--) {for(int j=i+1;j<=n;j++) {if(a[j]>=a[i] && f[j]+1>f[i])f[i]=f[j]+1;}if(f[i]>ans) ans=f[i];}printf("%d",ans);return 0;
}

我也就不解释了,直接讲一下O(NlogN)O(NlogN)O(NlogN)的算法。
我们定义一个f[len]f[len]f[len]数组,表示长度为len的不下降子序列末尾元素的最小值
当a[i]>=f[len]a[i]>=f[len]a[i]>=f[len]时,我们就f[++len]=a[i]f[++len]=a[i]f[++len]=a[i]。
当a[i]<f[len]a[i]<f[len]a[i]<f[len],我们就找一个在lenlenlen之前找一个数,刚好比a[i]a[i]a[i]大,用a[i]a[i]a[i]把这个数给替换掉。
因为fff数组一定是单调递增,所以我们在查找时可以使用STLSTLSTL中的upper_boundupper \_boundupper_bound函数来二分。

#include <bits/stdc++.h>
#include <stack>
using namespace std;
int n,a[1000005],f[1000005],cnt;int main() {scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);f[++cnt]=a[1];for(int i=2;i<=n;i++) {if(a[i]>=f[cnt]) f[++cnt]=a[i];else {int x=upper_bound(f+1,f+cnt+1,a[i])-f;f[x]=a[i];}}printf("%d\n",cnt);return 0;
}

输出序列

我们输出序列就需要定义一个数组ccc,用来记录每个元素在最长序列中的位置,即c[i]c[i]c[i]表示a[i]a[i]a[i]被放到了序列的第几个位置。

输出时,从 数组aaa的尾部开始,逆序依次找出ccc为len,len−1,len−2…3,2,1len, len-1, len-2 … 3, 2, 1len,len−1,len−2…3,2,1 的元素,并且找到一个就接着寻找c[i]−1c[i]-1c[i]−1,直到找到c[i]c[i]c[i]为111的数。

代码

#include <bits/stdc++.h>
#include <stack>
using namespace std;
int n,a[1000005],f[1000005],cnt,c[1000005];int main() {scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);if(n==0) {printf("0\n");return 0;}f[++cnt]=a[1],c[cnt]=1;for(int i=2;i<=n;i++) {if(a[i]>=f[cnt]) f[++cnt]=a[i],c[i]=cnt;else {int x=upper_bound(d+1,d+cnt+1,a[i])-d;f[x]=a[i],c[i]=x;}}printf("%d\n",cnt);stack<int> s;for(int i=n,j=cnt;i>=1 && j;i--)if(c[i]==j) s.push(a[i]),j--;while(s.size()) {printf("%d ",s.top());s.pop();}return 0;
}

例题:导弹拦截

传送门
我们只需要求一个最长不上升子序列和最长下降子序列。

#include <bits/stdc++.h>
using namespace std;
int n,a[100005],f[100005],cnt_1,dp[100005],cnt_2;int main() {while(scanf("%d",&a[++n])!=EOF); n--;f[++cnt_1]=a[1],dp[++cnt_2]=a[1];for(int i=2;i<=n;i++) {if(f[cnt_1]>=a[i]) f[++cnt_1]=a[i];else {int x=upper_bound(f+1,f+cnt_1+1,a[i],greater<int>())-f;f[x]=a[i];}if(dp[cnt_2]<a[i]) dp[++cnt_2]=a[i];else {int x=lower_bound(dp+1,dp+cnt_2+1,a[i])-dp;dp[x]=a[i];}}printf("%d\n%d",cnt_1,cnt_2);return 0;
}

最长不下降子序列O(NlogN) 输出序列相关推荐

  1. [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  2. 动态规划之最长不下降子序列

    一.概念明确 先来看一串数字:(20,17,19,22,4,7,10,12,5,2,13) 1.序列:像以上排成一列的数字,我们叫它序列,其中每个数字,可以被称为一个元素. 2.子序列:将序列中的部分 ...

  3. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  4. 求序列最长不下降子序列_最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

  5. 最长不下降子序列 (O(nlogn)算法)

    分析: 定义状态dp[i]表示长度为i的最长不下降子序列最大的那个数. 每次进来一个数直接找到dp数组第一个大于于它的数dp[x],并把dp[x - 1]修改成 那个数.就可以了 AC代码: # in ...

  6. 最长非下降子序列(O(nlogn))(offer收割)

    题目   如题 思路   核心思想是,维护一个数组ends,它记录了长度为k的子序列的末尾元素的最小值.听起来很抽象,我们不妨手动演示一遍整个过程.   假设数组a={2,9,4,27,29,15,7 ...

  7. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  8. 【P2766】 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  9. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...

最新文章

  1. 连通性2 无向图的双连通 bcc
  2. 32位jdk最大内存_你了解Java 内存区域和GC机制吗?
  3. ASP.NET页生命周期概述
  4. access订单明细表怎么做_成本明细表
  5. Qt中的QLineEdit、QTextEdit、QPlainTextEdit
  6. Nutanix:将IT基础架构“隐形”,让云更简单
  7. leetcode 169. 多数元素(不同数相消解法)
  8. 牛客网 在线编程 回文链表
  9. zookpeer实现对服务器动态上下线的监听
  10. java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...
  11. SLIC超像素分割并保存分割得到的超像素块,python代码
  12. web学习6-jdom
  13. 单片机74LS138扩展中断
  14. validation参数检验 - 如何使用
  15. 蜂鸟数据Trochil:论述制定策略的两种主要方法:市场假设和瑞士法郎案例研究-构建更好的策略1
  16. 芯片的本质是什么?(4)物质与数字世界接口
  17. My future of programming
  18. 如何更高效更系统地学习3D视觉?
  19. 爬虫01-爬取约会吧图片
  20. android checkbox自定义(文字位置、格式等)

热门文章

  1. 打印二维、多行的PDF-417条形码控件PDF417 Fonts and Encoder
  2. 如何用Spark进行数据分析
  3. WIFI热点——bat文件创建笔记本快捷wifi技术
  4. LeetCode(String) 2325. Decode the Message
  5. Control Groups示例
  6. 神经网络、机器学习和大数据速查图
  7. 中国天气城市代码编号
  8. Python生成信息熵决策树
  9. WP博客微信小程序的美化更新
  10. Fast-DDS库的安装教程