题目中叫求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] – l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。

      那么这个题目就转到怎么求r[]和l[]上了。如果每次依次向左向右找,肯定会超时的。这时就会用到迭代了,比如说求a[i]的l[i],如果a[i]大于a[i-1]那么l[i] = i;如果a[i]小于a[i-1],那么l[i]肯定小于l[i-1],找l[i]就可以直接跳到l[i-1]的位置上。

 

   1: #include <iostream>

   2: #include <cstdio>

   3: #include <cstring>

   4: #include <cmath>

   5: #include <algorithm>

   6: using namespace std;

   7: typedef long long ll;

   8: const int N=100010;

   9: int l[N],r[N],a[N],n;

  10:  

  11: int main()

  12: {

  13: //    freopen("in.txt","r",stdin);

  14:     while(scanf("%d",&n)>0&&n)

  15:     {

  16:         for(int i=1; i<=n; i++)

  17:         {

  18:             scanf("%d",&a[i]);

  19:             l[i]=r[i]=i;

  20:         }

  21:         a[0]=a[n+1]=-1;

  22:         for(int i=1; i<=n; i++)

  23:         {

  24:             while(a[i]<=a[l[i]-1])

  25:                 l[i]=l[l[i]-1];

  26:         }

  27:         for(int i=n; i>0; i--)

  28:         {

  29:             while(a[i]<=a[r[i]+1])

  30:                 r[i]=r[r[i]+1];

  31:         }

  32:         ll ans=0;

  33:         for(int i=1; i<=n; i++)

  34:         {

  35:             ll m=(ll)a[i]*(r[i]-l[i]+1);

  36:             ans=max(m,ans);

  37:         }

  38:         printf("%I64d\n",ans);

  39:     }

  40:     return 0;

  41: }

hdu 1506的更多相关文章

  1. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  2. HDU 1506 Largest Rectangle in a Histogram set+二分

    Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

  3. hdu 1506 Largest Rectangle in a Histogram 构造

    题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  4. HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

    单调栈和队列讲解:传送门 HDU -1506题意: 就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大 如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决 从左向右依次让每一 ...

  5. hdu 1506 Largest Rectangle in a Histogram——笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 关于笛卡尔树的构建:https://www.cnblogs.com/reverymoon/p/952 ...

  6. hdu 1506 单调栈问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目的意思其实就是要找到一个尽可能大的矩形来完全覆盖这个矩形下的所有柱子,只能覆盖柱子,不能留空 ...

  7. HDU 1506 Largest Rectangle in a Histogram(区间DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目: Largest Rectangle in a Histogram Time Limit: ...

  8. hdu 1506(dp求最大子矩阵)

    题意:容易理解... 分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1:我们从左到 右扫一遍,求出每个点的 ...

  9. HDU 1505 Largest Rectangle in a Histogram &amp;&amp; HDU 1506 City Game(动态规划)

    1506意甲冠军:给你一个连续的直方图(拼贴底部长度1).求连续基质区. 对每一个直方图,分别向左向右进行扩展. #include<cstdio> #include<stdlib.h ...

  10. hdu 1506 直方图内最大矩形

    题目传送门//res tp hdu 单调栈的经典问题 维护区间的左右边界计算面积即可 #include<iostream> #include<algorithm> #inclu ...

随机推荐

  1. OnMeasureItem和OnDrawItem的区别和联系

    我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题.拥有美丽的外观,软件就成功了一半.界面由控件.工具栏.菜单.窗体等元素组成,对他们进行美化就能得到一个美丽的界面. 目前 ...

  2. css样式表和选择器的优先级以及position元素属性值的区别

    css样式表优先级 问题:当同一个HTML元素被不止一个样式定义时,会使用哪个样式呢? 答:一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中,其中数字4拥有最高的优先权. 1.浏览器缺省 ...

  3. Python入门笔记(15):对文件的操作(1)

    一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python 核心编程>上说的很晦涩,这里没有深刻理解到,希望有人能解释给我听. >>> ...

  4. sql server2008中怎样用sql语句创建数据库和数据表

    这是简单用代码实现创建数据库和数据表的sql语句,如下: --调用系统数据库-- use master go /***防止你要创建的数据库同名,先把它删除掉****/ if Exists(select ...

  5. MyBatis的一些基本操作

    在学校里只学过一点点的hibernate基础,但是这几天被熊哥叫去写好几个类的接口,所以就去百度了一下mybatis的接口方式怎么使用.1定义接口,并且定义其中要使用到的方法,这里必须注意到的是方法名 ...

  6. No.012:Integer to Roman

    题目: Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from ...

  7. css中important的用处

    今天看代码时遇到一段不理解的地方. #note_content { line-height: 22px; border: #DEDEDE 1px solid; background: #FAFAFA; ...

  8. php学习笔记:读取文档的内容,利用php修改文档内容

    直接上代码 <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/9/10 0010 * Time: 20:27 ...

  9. android onNewIntent

    在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就 ...

  10. <<摩托车修理技术与禅>>读书笔记

    一旦想要求快,就表示你再也不关心它,而想去做别的事. 感触比较大的一句话.其实每个人看书,都有不同的侧重点,不同经历的人看同样的书,收获是不一样的,所以不能在乎收获多少,只要有收获就行.