本文主要是介绍POJ 2559 / HDU 1506 / LightOJ 1083 Largest Rectangle in a Histogram (单调栈),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description

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
Output
Sample Input
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
Sample Output
8 4000
/*POJ: 157ms,1728KB*/
/*HDU: 78ms,1792KB*/
/*LightOJ: 0.112s,2040KB*/#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100010;__int64 h[N];
int l[N], r[N];int main(void)
{int n, i, j;__int64 ans;while (~scanf("%d", &n), n){for (i = 1; i <= n; ++i)scanf("%I64d", &h[i]);for (i = 1; i <= n; ++i){j = i;while (j > 1 && h[j - 1] >= h[i]) /// 压栈否j = l[j - 1]; /// 出栈l[i] = j;}for (i = n; i >= 1; --i){j = i;while (j < n && h[j + 1] >= h[i]) /// 压栈否j = r[j + 1]; /// 出栈r[i] = j;}ans = 0;for (i = 1; i <= n; ++i)ans = max(ans, h[i] * (r[i] - l[i] + 1));printf("%I64d\n", ans);}return 0;
}
这篇关于POJ 2559 / HDU 1506 / LightOJ 1083 Largest Rectangle in a Histogram (单调栈)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!