Largest Rectangle in a Histogram
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3722 Accepted Submission(s): 1104
Problem Description
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:
Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.
Input
The input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectangles it is composed of. You may assume that 1 <= n <= 100000. Then follow n integers h1, ..., hn, where 0 <= hi <= 1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is 1. A zero follows the input for the last test case.
Output
For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.
Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Sample Output
题目大意:给你一块柱状图,要求放一块矩形进去,使得矩形最大,求这个矩形的面积。用DP解决。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
代码:
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int l[100005], r[100005];
long long h[100005];
int main()
{
int i, n;
long long area, MAX; //数据很大,用long long防止溢出
while(scanf("%d", &n), n)
{
for(i = 1; i <= n; i++)
{
scanf("%I64d", &h[i]);
l[i] = r[i] = i;
}
h[0] = h[n+1] = -1; //-1防止死循环,高度可能为0
for(i = n; i >= 1; i--) //找右界,要从最右边开始找,不然TLE
{
while(h[i] <= h[ r[i]+1 ])
{
r[i] = r[ r[i]+1 ];
}
}
for(i = 1; i <= n; i++) //找左界,要从最左边开始找
{
while(h[i] <= h[ l[i]-1 ])
{
l[i] = l[ l[i]-1 ];
}
}
MAX = 0;
for(i = 1; i <= n; i++)
{
area = (r[i] - l[i] + 1) * h[i]; //面积:该点的(右界-左界+1)*高度
MAX = max(MAX, area);
}
printf("%I64d\n", MAX);
}
return 0;
}
- 大小: 2.4 KB
分享到:
相关推荐
【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...
Largest prime factor Everybody knows any number can be combined by the prime number. Now, your task is telling me what position of the largest prime factor. The position of prime 2 is 1, prime 3 is 2,...
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,...
HDU上DP大集合,里面包括题,题解,代码,对DP入门者很实用,对DP老手也是有很大的提高
DP(Dynamic Programming,动态规划)是一种非常重要的算法思想,在 ACM HDU 题目分类中,DP 问题占据了很大的比例。例如,1003 DP 经典问题,最大连续子段和;1024 经典 DP,最大 M 子段和;1025 经典 DP,最长递增...
题目链接:[LargestRectangle](http://acm.hdu.edu.cn/showproblem.php?pid=1506) - **问题描述**:求直方图中最大的矩形面积。 - **解题思路**: - 使用单调栈辅助计算。 - 定义状态$Area = height[i] * (j - k ...
标题中的“DP.rar”表明这是一个关于动态规划的资料压缩包,而“DP_hdu”暗示了这些题目可能来自杭州电子科技大学(HDU)的在线编程平台。动态规划通常用于解决那些可以通过子问题的最优解来构建原问题最优解的问题...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
- **状态转移方程**:`dp[i] = max(dp[j] + 1)`,其中`j 并且`a[j] < a[i]`,即当前元素`a[i]`能作为递增子序列的末尾时,其最长递增子序列的长度为之前以`a[j]`结尾的最长递增子序列长度加1。 - **初始化**:对于每...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
hdu 1005.比较简单的一道题,有兴趣的可以看看。
### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...
- **条件判断**:使用 `if` 条件语句来控制程序流程,例如 `if(a>a[i+1])`。 - **数据交换**:通过中间变量 `t` 实现两个变量值的交换,如 `t=a; a=a[i+1]; a[i+1]=t;`。 #### 算法知识点 - **排序算法**:代码中...
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
4. **Largest Rectangle**(题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506) 这是求二维数组中由行构成的最大矩形面积的问题。通过维护左右边界`l[]`和`r[]`数组,可以找到每个元素左边和右边满足条件...
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
hdu2101AC代码