试题编号: 201312-3
试题名称: 最大的矩形
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。

  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
输入格式
  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3
样例输出
10


问题链接:CCF201312试题。

问题描述:首先输入正整数n,接着输入n个正整数表示直方图的一个高度,计算这些直方图中的最大矩形面积。

问题分析:解决这个问题,一种是用暴力法(枚举法)来解决,任何一个矩形必然始于第i个直方图,终止于第j块直方图(i<=j),从所有这些面积中找出最大矩形面积即可;另外一种办法是对这n个数只看一遍,就算出最大矩形面积,其计算复杂度为O(n),相比较而言,算法要复杂一些,还需要付出空间的代价。仔细观察这两个算法有关的程序,会发现其实二者之间算法复杂度的差异很小。

程序说明:本程序采用后一种方法实现。基本思想是先找到一个逐步递增的面积,即如果Hi<Hi+1则最大面积是逐步递增的。这个过程中,将这些Hi放入堆栈中,直到不满足Hi<Hi+1为止。这个时候,最大的面积可能是最右边是Hi,由若干块(也可能只有1块)拼成的,从中获得一个最大的面积。出现面积非递增时,则把堆栈中比当前高的直方图弹出,重复上述过程,需要说明的是这不影响高的直方图与其右边连成一片。还有一点就是,所有的直方图的高度Hi>=1,这是一个前提,如果有的直方图高度为0,则这个算法需要另外设计。

参见:CCF201312-3 最大的矩形(100分)。

提交后得100分的C++语言程序如下:

/* CCF201312-3 最大的矩形 */#include <iostream>
#include <stack>using namespace std;const int N = 1000;
int h[N+1];int main()
{int n, ans=0, area, temp;// 输入数据cin >> n;for(int i=0; i<n; i++)cin >> h[i];h[n] = 0;// 计算最大矩形面积stack<int> s;for(int i=0; i<=n; i++) {if (s.empty() || h[s.top()] < h[i])s.push(i);else {temp = s.top();s.pop();            //弹出area = h[temp] * (s.empty() ? i : i - s.top() - 1);if (area > ans)ans = area;--i;}}// 输出结果cout << ans << endl;return 0;
}

CCF201312-3 最大的矩形(解法二)(100分)(废除!!!)相关推荐

  1. 6-2 综合成绩排名-结构体二 (100分)

    6-2 综合成绩排名-结构体二 (100分) 众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试.学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加 ...

  2. HDU1106 排序(解法二)(废除!!!)

    本文废除!!! 请点击以下的参考链接!!! 参考链接:HDU1106 排序[字符串+整数+排序]. 问题链接:HDU1106 排序. 问题简述:参见上述链接. 问题分析:这个程序的逻辑并不十分复杂,主 ...

  3. HDU2502 月之数(解法二)【废除!!!】

    本文废除,参见以下链接. 参考链接:HDU2502 月之数[递推] 月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  4. HDU4607 Park Visit(解法二)【废除!!!】

    本文废除!!! 参见链接:HDU4607 Park Visit[DFS] 问题链接:HDU4607 Park Visit. 题意简述:莱克尔和她的朋友到公园玩,公园很大也很漂亮.公园包含n个景点通过n ...

  5. HDU1013 POJ1519 Digital Roots(解法二)【废除!!!】

    本文废除!!! 参见链接:HDU1013 POJ1519 UVALive2085 Digital Roots[数根+水题] 该问题的最佳解法是利用数论的9余数定理来计算数根.一个数的数根等于该数的9的 ...

  6. HDU1164 Eddy's research I(解法二)【废除!!!】

    本文废除,参见以下参考链接: 参考链接:HDU1164 Eddy's research I[素因子分解+筛选法+欧拉函数] 问题链接:HDU1164 Eddy's research I 问题描述:参见 ...

  7. UVALive5461 UVA615 POJ1308 Is It A Tree?(解法二)【废除!!!】

    本文废除!!! 参考链接:UVALive5461 UVA615 POJ1308 ZOJ1268 Is It A Tree?[并查集] Regionals 1997 >> North Ame ...

  8. POJ1338 Ugly Numbers(解法二)【废除!!!】

    本文废除!!! 参考链接:POJ1338 Ugly Numbers[水题] 问题链接:POJ1338 Ugly Numbers.基础级练习题,用C语言编写程序. 题意简述:不能被2.3和5以外的素数整 ...

  9. HDU1234 开门人和关门人(解法二)【废除!!!】

    本文废除!!! 参考链接:HDU1234 开门人和关门人 问题链接:HDU1234 开门人和关门人. 问题简述:参见上述链接. 问题分析:之前所做的程序质量不高,所以重做该题的题解.上次使用了结构数组 ...

  10. HDU2072 单词数(解法二)【废除!!!】

    本文废除!!! 参考链接:HDU2072 单词数[水题] 问题链接:HDU2072 单词数. 问题描述:参见上文. 问题分析:这是一个比较简单的问题,一行一行读入字符串,统计该行有几个单词.单词之间只 ...

最新文章

  1. oracle 查询本周数据生成下周数据
  2. java中的权限修饰符_Java的权限修饰符的区别和用法总结
  3. python一箭穿心代码怎样复制,Python Decimal copy_sign()用法及代码示例
  4. 《移动应用开发》作业——HTML、CSS
  5. swift和oc区别----属性部分(参考官方swift2.1文档)
  6. HLS_error implicit instantiation of undefined template ‘ssdm_int
  7. Windows下源码获取
  8. c#中connect函数_Flink算子使用方法及实例演示:union和connect
  9. 【tyvj3303】连接格点,区分多维与单维很关键
  10. 【安全】通过LAM(ldap-account-manager)来管理OpenLDAP
  11. 帆软报表使用及设置日志打印sql
  12. dockerfile入门
  13. 云计算与大数据技术 第一章
  14. Linux如何固定ip地址,及ifcfg-ens33文件参数
  15. 宝宝专业智力测试软件,儿童医院心理科做智商检测-儿童智力测试仪_儿童注意力测试仪_儿童综合素质测试仪/测评系统...
  16. js实现复制图片到剪切板下载图片
  17. 在iPhone上使用3D Touch
  18. noi题库c语言 1.5答案,NOIP2004提高组复赛试题答案c语言版
  19. 【HTML5】Web前端——网页实用技巧1:将一个方形图片,变成圆形(利用CSS属性)
  20. 计算机学院论文谢辞怎么写,论文致谢:函授毕业论文谢辞怎么写

热门文章

  1. golang控制台颜色输出(for windows)
  2. Vuforia开发完全指南
  3. 为什么玩家会流失:如何理解次日留存率
  4. 完成端口中的单句柄数据结构与单IO数据结构的理解与设计
  5. c语言指针f32*,还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)
  6. 【java学习之路】(javaWeb【后端】篇)003.RequestResponse
  7. parafac 分解_基于PARAFAC分解的大规模MU-MIMO稀疏信道估计
  8. 人生苦短 我用Python
  9. Intellij IDEA的配置
  10. selenium自动化测试框架_自动化测试框架