1102 面积最大的矩形

来源:互联网 发布:幼儿英语软件 编辑:程序博客网 时间:2024/05/10 10:18
有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:


面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000)第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
OutPut
输出最大的矩形面积
Input示例
6215623
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;}


0 0
原创粉丝点击