题意:

给你n个数hi,你刚开始在第1个数的位置,你需要跳到第n个数的位置。

1、对于i、j(i<j) 如果满足

max(hi+1,…,hj−1)<min(hi,hj)

max(hi,hj)<min(hi+1,…,hj−1)

那么就可以从i直接一步跳到j位置

2、如果j=i+1,那么也可以直接跳过去

问你从第一个位置跳到第n个位置,最少需要跳多少次

题解:

我们设dp[i]表示:从第一个位置跳到第i个位置最小需要跳多少次

我们最重要的就是找在[1,i-1]这个区间内的k,哪个位置可以跳到i位置以使得dp[i]尽可能小。如果暴力查找的话,那么复杂度就是O(n*n),看一下数据就知道TLE

那我们就要用一种数据结构来使得找这个k,这里我们使用栈,为什么不使用队列,因为如果满足

max(hk+1,…,hi-1)<min(hk,hi)

max(hk,hi)<min(hk+1,…,hi-1)

就可以从k一步跳到i,我们使用单调队列那么就是从头开始了。

我们维护两个单调栈,一个非严格递增,另一个非严格递减

我们在这里讨论非严格单调递增栈的维护过程:

如果一个数vi在放入栈之前,判断得知hi>=h[r.top],那么就可以从r.top位置跳到i位置。

这个时候有一个问题,如果你把栈中的一些元素pop掉了,但是这些元素还可以更新大于i的位置的dp值 这个时候会影响最后的结果吗?

其实是不会影响的,因为如果hk在hi进行栈之前被pop掉了,那么hk肯定是小于hi的。如果hk可以更新hj的信息(i<j) 那么vk和vj中那个大的肯定会小于min(vk+1,vk+2...vj-1)。 那么这个时候我们看我们维护的另一个非严格下降序列,它会替我们考虑这个问题的

所以这样实现起来其实是没有问题的

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=3e5+10;
const int INF=0x3f3f3f3f;
#define mem_(x) memset(x,INF,sizeof(x))
int v[maxn],dp[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&v[i]);
}
mem_(dp);
stack<int>r; //非严格递增
stack<int>r2; //非严格递减
r.push(1);
r2.push(1);
dp[1]=0;
for(int i=2;i<=n;++i)
{
int flag1=0,flag2=0;
while(r.size() && v[i]>=v[r.top()])
{
//printf("%d %d\n",i,r.top());
if(v[i]==v[r.top()]) flag1=1; //如果栈里面有数字和vi相等,那么我们在下面的判断中就不能使用r.top
dp[i]=min(dp[i],dp[r.top()]+1); //进行更新vi的值,因为题目要求vi和vj之间的数要小于两者中的最小值
r.pop();
//flag1=1;
}
if(r.size() && !flag1)
{
dp[i]=min(dp[i],dp[r.top()]+1);
}
r.push(i); while(r2.size() && v[i]<=v[r2.top()])
{
if(v[i]==v[r2.top()]) flag2=1;
dp[i]=min(dp[i],dp[r2.top()]+1);
r2.pop();
//flag2=1;
}
if(r2.size() && !flag2)
{
dp[i]=min(dp[i],dp[r2.top()]+1);
}
r2.push(i);
}
printf("%d\n",dp[n]);
return 0;
}

Discrete Centrifugal Jumps CodeForces - 1407D 单调栈+dp的更多相关文章

  1. 洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)

    正解:单调栈/dp 解题报告: 先放个传送门qwq 话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq (umm主要如果dp做好像是要斜率优化凸壳维护双 ...

  2. Codeforces 1383E - Strange Operation(线段树优化 DP or 单调栈+DP)

    Codeforces 题目传送门 & 洛谷题目传送门 Yet another 自己搞出来的难度 \(\ge 2800\) 的题 介绍一个奇奇怪怪的 \(n\log n\) 的做法.首先特判掉字 ...

  3. CodeForces 548D 单调栈

    Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  4. CF1407D Discrete Centrifugal Jumps 题解

    蒟蒻语 写了 \(100\) 行的 线段树上ST表维护二分维护单调栈维护dp, 结果最后发现只要俩单调栈就好了 = = 蒟蒻解 首先 \(dp_i\) 表示从 \(1\) 楼到 \(i\) 楼要跳几次 ...

  5. BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】

    题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个 ...

  6. bzoj4709 柠檬 单调栈,DP,斜率优化

    目录 前言吐槽 思路 错误 代码 /* 前言吐槽 我真的不知道是咋做的 不过大约就是栈的斜率优化 哪位大佬见识广,给看看吧(乞讨) 思路 s是值等于a[i]的前缀和 转移方程$f[i]=max(f[i ...

  7. Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)

    https://codeforces.com/contest/1131/problem/G 题意 给你一排m个的骨牌(m<=1e7),每块之间相距1,每块高h[i],推倒代价c[i],假如\(a ...

  8. POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15831 ...

  9. HDU1506(单调栈或者DP) 分类: 数据结构 2015-07-07 23:23 2人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. 【剑指 Offer】12.矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格. 如果一条路径经过了矩阵的某一格,那么 ...

  2. LeetCode53 最大子序列问题

    题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和.     示例:     输入: [-2,1,-3,4,-1,2,1,-5,4],   ...

  3. 【Git】5、Git如何提交代码到远程仓库

    提交代码:如何把修改后的代码提交到远程仓库 文章目录 提交代码:如何把修改后的代码提交到远程仓库 1.同步远程代码 2.检查改动文件 3.添加文件到缓存 4.提交代码 5.推送代码 6.我的整个流程 ...

  4. 使用K8s的一些经验和体会

    坑 Java应用程序的奇怪案例 ​ 在微服务和容器化方面,工程师倾向于避免使用 Java,这主要是由于 Java 臭名昭著的内存管理.但是,现在情况发生了改变,过去几年来 Java 的容器兼容性得到了 ...

  5. 【Oracle】10.2.0.1升级到10.2.0.5

    升级数据库到10.2.0.5   因是测试环境,不需要备份:如是生产系统,建议进行全备份后再进行升级操作,预防数据丢失造成不必要的影响.   步骤: 上传并解压补丁,安装前准备,安装补丁,预升级检查, ...

  6. 面试必问:如何实现Redis分布式锁

    摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...

  7. Docker数据目录迁移解决方案

    场景 在docker的使用中随着下载镜像越来越多,构建镜像.运行容器越来越多, 数据目录必然会逐渐增大:当所有docker镜像.容器对磁盘的使用达到上限时,就需要对数据目录进行迁移. 如何避免: 1. ...

  8. 使用bandit对目标python代码进行安全函数扫描

    技术背景 在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响.典型的例如python的沙箱逃逸问题,通过一些python的第三方 ...

  9. 转 7 jmeter之参数化

    7 jmeter之参数化   badboy里参数化(前面4 jmeter badboy脚本开发技术详解已讲过) jmeter里参数化-1 用户参数 1.打开badboy工具,点击红色按钮开始录制,在地 ...

  10. 你真的了解Android系统启动流程吗?Android高级工程师必看系列,已开源

    前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...