有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
![](http://img.51nod.com/upfile/000fbce2/08d164337bdb2808000000000027de17.png)
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000) 第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
OutPut
输出最大的矩形面积
Input示例
6 2 1 5 6 2 3
Output示例
10
解题思路:求解每个长方形的l[i], r[i],最终求解面积的最大值。
可以采用递推的方法求解l[i], r[i]。 这次换个做法,采用单调队列求解l[i], r[i].
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <string> #include <vector> #include <deque> #include <queue> #include <algorithm> using namespace std; const int maxn = 50010; const int inf = 0x3f3f3f3f; typedef long long ll; int h[maxn], l[maxn], r[maxn]; int main() { int n; ll ans = 0; deque<int> dq; scanf("%d", &n); h[0] = h[n+1] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &h[i]); } dq.push_back(n); for(int i = n - 1; i >= 0; --i) { if(h[dq.back()] <= h[i]) { dq.push_back(i); } else { int t = dq.back(); while(dq.size() > 0 && h[dq.back()] > h[i]) { l[dq.back()] = t; dq.pop_back(); } dq.push_back(i); } } while(dq.size() > 0) dq.pop_back(); dq.push_back(1); for(int i = 2; i <= n + 1; ++i) { if(h[i] >= h[dq.back()]) { dq.push_back(i); } else { int t = dq.back(); while(dq.size() > 0 && h[dq.back()] > h[i]) { r[dq.back()] = t; dq.pop_back(); } dq.push_back(i); } } /* for(int i = 1; i <= n; ++i) { printf("%d %d\n", l[i], r[i]); } */ for(int i = 1; i <= n; ++i) { ans = max(ans, 1LL*h[i]*(r[i]-l[i]+1)); } cout << ans << endl; return 0; }