HDU - 1506 Largest Rectangle in a Histogram: 單調棧入門題

題目點此跳轉

思路

 題目意思是有一個由許多矩形組成的一個圖形(下底對齊), 求這個圖形裏能找到的最大矩形的面積, 輸入的是各個矩形的高度。 例如下圖

這裏寫圖片描述

 很顯然,這一題就是要求對於每一個矩形而言,它往左或右最多的比他高的矩形的個數, 也就是說,對於輸入的那個數組,我們只要求出每一個元素能往左右延伸到什麼地方即可,延伸的定義是不比它小的才行。
 使用單調棧是解決這個問題的一個很好的辦法。
 我們維護一個單調棧,將數組從左到右入棧, 但是在入棧前要檢查一下棧頂元素是不是比它大,如果比它大的話,說明棧頂元素就能擴展到這裏了,那麼就找到了棧頂元素的一個邊界。 左右各掃一次就行了。
 總結一句話,每次出棧的時候就是找到這個出棧元素邊界的時候。

代碼

LL n, a[maxn], dp[maxn], ans;
LL q[maxn], p[maxn], ft, rr;

int main() {
    while(scanf("%lld", &n) == 1 && n) {
        for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
        ft = rr = 0;
        q[rr++] = a[1], p[rr-1] = 1; a[n+1] = -1; ans = 0;
        for(int i = 2; i <= n+1; ++i) {
            while(rr > ft && q[rr-1] > a[i]) {
                dp[p[rr-1]] = i-p[rr-1]; --rr;
            }
            q[rr++] = a[i], p[rr-1] = i;
        }
        ft = rr = 0;
        q[rr++] = a[n], p[rr-1] = n; a[0] = -1;
        for(int i = n-1; i >= 0; --i) {
            while(rr > ft && q[rr-1] > a[i]) {
                dp[p[rr-1]] += p[rr-1]-i-1; --rr;
            }
            q[rr++] = a[i], p[rr-1] = i;
        }
        ans = 0;
        for(int i = 1; i <= n; ++i) ans = max(ans, dp[i]*a[i]);
        printf("%lld\n", ans);
    }

    return 0;
}
發佈了115 篇原創文章 · 獲贊 27 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章