AcWing - 131 - 直方图中最大的矩形 = 单调栈

Posted inko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing - 131 - 直方图中最大的矩形 = 单调栈相关的知识,希望对你有一定的参考价值。

https://www.acwing.com/problem/content/133/

单调栈的模板题,按道理悬线dp不用的话也可以这样做。

需要注意这道题不能直接dp,比如[3,5,4],这组数据,3可以拓展5,但5不能拓展4,不过3可以拓展4。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;

ll a[100005];
int l[100005];
int r[100005];

stack<int> st;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    while(~scanf("%d", &n)) {
        if(n == 0)
            break;
        for(int i = 1; i <= n; ++i) {
            scanf("%lld", &a[i]);
        }

        for(int i = 1; i <= n; ++i) {
            while(st.size() && a[i] < a[st.top()]) {
                r[st.top()] = i - 1;
                st.pop();
            }
            st.push(i);
        }

        while(st.size()) {
            r[st.top()] = n;
            st.pop();
        }

        for(int i = n; i >= 1; --i) {
            while(st.size() && a[i] < a[st.top()]) {
                l[st.top()] = i + 1;
                st.pop();
            }
            st.push(i);
        }

        while(st.size()) {
            l[st.top()] = 1;
            st.pop();
        }

        ll ans = 0;
        for(int i = 1; i <= n; ++i) {
            ans = max(ans, 1ll * a[i] * (r[i] - l[i] + 1));
        }

        printf("%lld
", ans);
    }
}

以上是关于AcWing - 131 - 直方图中最大的矩形 = 单调栈的主要内容,如果未能解决你的问题,请参考以下文章

POJ2559 acwing131 Largest Rectangle in a Histogram [单调栈]

131. 直方图中最大的矩形单调栈

直方图中最大矩形面积

Leetcode 84 求直方图中矩形的最大面积

直方图中的最大矩形

栈的灵活实际应用——直方图最大矩形面积