最长不下降子序列O(NlogN) 输出序列
文章目录
- 不输出序列的思路
- 输出序列
- 代码
- 例题:导弹拦截
不输出序列的思路
我们对于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) 输出序列相关推荐
- [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- 动态规划之最长不下降子序列
一.概念明确 先来看一串数字:(20,17,19,22,4,7,10,12,5,2,13) 1.序列:像以上排成一列的数字,我们叫它序列,其中每个数字,可以被称为一个元素. 2.子序列:将序列中的部分 ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...
- 求序列最长不下降子序列_最长不下降子序列nlogn算法详解
今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...
- 最长不下降子序列 (O(nlogn)算法)
分析: 定义状态dp[i]表示长度为i的最长不下降子序列最大的那个数. 每次进来一个数直接找到dp数组第一个大于于它的数dp[x],并把dp[x - 1]修改成 那个数.就可以了 AC代码: # in ...
- 最长非下降子序列(O(nlogn))(offer收割)
题目 如题 思路 核心思想是,维护一个数组ends,它记录了长度为k的子序列的末尾元素的最小值.听起来很抽象,我们不妨手动演示一遍整个过程. 假设数组a={2,9,4,27,29,15,7 ...
- 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...
- 【P2766】 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...
最新文章
- 连通性2 无向图的双连通 bcc
- 32位jdk最大内存_你了解Java 内存区域和GC机制吗?
- ASP.NET页生命周期概述
- access订单明细表怎么做_成本明细表
- Qt中的QLineEdit、QTextEdit、QPlainTextEdit
- Nutanix:将IT基础架构“隐形”,让云更简单
- leetcode 169. 多数元素(不同数相消解法)
- 牛客网 在线编程 回文链表
- zookpeer实现对服务器动态上下线的监听
- java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...
- SLIC超像素分割并保存分割得到的超像素块,python代码
- web学习6-jdom
- 单片机74LS138扩展中断
- validation参数检验 - 如何使用
- 蜂鸟数据Trochil:论述制定策略的两种主要方法:市场假设和瑞士法郎案例研究-构建更好的策略1
- 芯片的本质是什么?(4)物质与数字世界接口
- My future of programming
- 如何更高效更系统地学习3D视觉?
- 爬虫01-爬取约会吧图片
- android checkbox自定义(文字位置、格式等)