QDUOJ LC的课后辅导 单调递增栈
LC的课后辅导
发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M
有一天,LC给我们出了一道题,如图:
这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积。
多组测试数据 每组测试数据的第一行为n(0 <= n <= 100), 表示图形有n个小矩形构成 接下来一行输入n个整数h1, h2...hn(0 <= hi <= 1000), 表示每个小矩形的高度 n为0时程序结束
仅输出一行表示面积的最大值
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
8
4000
思路:开两个数组分别记录每一个矩形以他为中心所能达到的左右长度,然后面积就是h*(r-l+1);这里要注意的是如果该矩形比上一个或后一个矩形要小,则上一个矩形所能达到的区间,该矩形一定可以达到, ac代码: #include<stdio.h> int main() { int a[101];int n,max,i;while(scanf("%d",&n)!=EOF){ if(n==0)break;for(i=1;i<=n;i++)scanf("%d",&a[i]);int l[101],r[101];l[1]=1;r[n]=n;int t;for(i=2;i<=n;i++){ t=i;while(t>1&&a[i]<=a[t-1])t=l[t-1];l[i]=t;}for(i=n-1;i>=1;i--){ t=i;while(t<n&&a[i]<=a[t+1])t=r[t+1];r[i]=t;}int max=-1;for(i=1;i<=n;i++){ if((r[i]-l[i]+1)*a[i]>max)max=(r[i]-l[i]+1)*a[i];}printf("%d\n",max);}return 0; }最近在接触单调栈,又用栈实现了一下,这里维护一个单增栈,那么如果要进栈的数不能直接入栈,说明当前栈顶比他大,就说明它可以延伸,一直到可以进栈为止,也就是说通过维护单增栈我们一定可以找到左面第一个比他小的和右面第一个比他小的;还有这里因为矩形的高度可能相同,所以当栈为空时说明可以延伸到头或者尾;#include<stdio.h> #include<string.h> #include<algorithm> #include<stack> #define N 100010 using namespace std; int a[N],l[N],r[N]; int main() { int n,i;while(scanf("%d",&n)!=EOF){if(n==0)break; stack<long long >st;while(!st.empty())st.pop();l[1]=1;st.push(1);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++){ if(a[st.top()]>=a[i]){ while(!st.empty()&&a[st.top()]>=a[i]){ st.pop();}if(st.empty())l[i]=1;elsel[i]=st.top()+1;st.push(i);}else{ l[i]=i;st.push(i);}}while(!st.empty())st.pop();r[n]=n;st.push(n);for(i=n;i>=1;i--){ if(a[st.top()]>=a[i]){ while(!st.empty()&&a[st.top()]>=a[i]){ st.pop();}if(st.empty())r[i]=n;elser[i]=st.top()-1;st.push(i);}else{ r[i]=i;st.push(i);}}//for(i=1;i<=n;i++)//printf("%d %d\n",l[i],r[i]);long long ans=0;for(i=1;i<=n;i++)ans=max(ans,(long long)(r[i]-l[i]+1)*a[i]);printf("%lld\n",ans);}return 0; }
转载于:https://www.cnblogs.com/yzm10/p/7193794.html
QDUOJ LC的课后辅导 单调递增栈相关推荐
- qduoj LC的课后辅导(单调栈)
LC的课后辅导 发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M 描述 有一天,LC给我们出了一道题,如图: 这个图形从左到右由若干个 宽为1 高不 ...
- qduoj LC的课后辅导
LC的课后辅导 发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M 描述 有一天,LC给我们出了一道题,如图: 这个图形从左到右由若干个 宽为1 高不 ...
- LeetCode 84. 柱状图中最大的矩形(单调递增栈)
文章目录 1. 题目 2. 解题 1. 题目 题目链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是 ...
- LeetCode 85. 最大矩形(DP/单调递增栈,难)
文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...
- 力扣刷题-python-单调栈(单调递减栈、单调递增栈)
文章目录 1.单调栈 2.单调递减栈 3.单调递增栈 4.总结 1.单调栈 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,要用单调栈. 2.单调递减栈 单调递减栈,栈 ...
- LC的课后辅导 QDU
点击打开链接 此题暴力可过(O(n^2)) 亦可用栈优化(O(n)) 即通过栈保存矩形编号 找出每个矩形左右可到达的最远边界 例如从左至右遍历 遍历至哪个矩形 该矩形的左边界即可得 假设遍历至h[i] ...
- 模板_单调栈_AcWing_830. 单调栈_底顶递增栈
模板_单调栈_AcWing_830. 单调栈_底顶递增栈 830. 单调栈 题目 提交记录 讨论 题解 视频讲解 给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 − ...
- 动态规划作业 最长单调递增子序列
动态规划作业 1.最长单调递增子序列 设计一个 O(n2)时间的算法,找出由 n 个数组成的序列 a 的最长单调递增子序列. 提示: 用数组 b[0:n]纪录以 a[i] (0<= i< ...
- _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树
_32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...
最新文章
- 《C语言编程初学者指南》一2.9 理解运算符优先级
- lodash源码分析之获取数据类型
- python开发工程师面试题-分析经典Python开发工程师面试题
- Eos离线密钥生成的PHP代码
- approach for doing things
- MCtalk对话学霸君:在线教育“1对多小班化”是个伪命题
- 令人拍案叫绝的EfficientNet和EfficientDet
- modelandview为null的原因_一千个不用 Null 的理由!
- Linux操作系统下进程讲解(史上最强总结)
- UVA11310 Delivery Debacle【铺砖问题】
- python小白从哪来开始-Python爬虫小白入门(一)写在前面
- VS2015 经常不出现智能提示,代码颜色也没有了
- Springboot--Ehcache-Jpa (1)
- 在线网上书店管理系统
- 如何查看一个网页源代码的最后更新时间
- 使用 FFmpeg 工具合并本地多个.ts文件为单个.MP4
- 投资组合报告-马科维茨模型
- ClickHouse基本语法及常见存储引擎
- Moos-IvP 实验室7 Helm Autonomy 任务详解
- python编码口诀_【每日一练】python输出 9*9 乘法口诀表
热门文章
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)...
- jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解
- MFC下运行控制台不显示黑屏
- jquery-validation 使用
- ORA-01502: 索引或这类索引的分区处于不可用状态 [已解决]
- Python数据结构与算法(二)栈和队列
- 初一数学教材人教版_【期中试卷+知识点总结】初中初一初二初三年级各科期中试卷+知识点总结...
- SQL Server触发器创建、删除、修改、查看
- 如何鉴别项目经理/软件设计师的水平
- uos系统终端调试linux命令,uos怎么开启开发者模式