1. 程式人生 > >POJ2559--Largest Rectangle in a Histogram(棧)

POJ2559--Largest Rectangle in a Histogram(棧)

題目大意:有n個寬為1,高為h1,h2,h3...hn的長方形從左到右依次排列,形成一個柱狀圖,求最大矩形面積

分析:運用棧來求解。

首先,我們可以得到這樣一個事實,假設最大的矩形的兩個端點為L[i], R[i],高度為h,

那麼端點兩邊的矩形的高都比這個最大矩形的高h要小。接下來,我們從左到右,依次列舉各個矩形,假設當前矩形的高就是最大矩形

的高,然後就開始求L[i]。從右到左R[i]。這裡求解L[i],R[i]就是棧的運用了。

以L[i]為例,當後一個矩形的高小於當前的高,就可以結束迴圈了,得到L[i],否則將後一個矩形的編號入棧。

程式碼:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 111111;

long long n;
long long h[maxn];
int L[maxn], R[maxn];
long long st[maxn];

int main() {
    while(scanf("%lld", &n) && n != 0) {
        for(int i = 0; i < n; i++)
            scanf("%lld", &h[i]);
        int t = 0;
        for(int i = 0; i < n; i++) {
            while(t > 0 && h[st[t-1]] >= h[i]) t--;
            L[i] = t == 0 ? 0 : (st[t-1]+1);
            st[t++] = i;
        }
        t = 0;
        for(int i = n-1; i >= 0; i--) {
            while(t > 0 && h[st[t-1]] >= h[i]) t--;
            R[i] = t == 0 ? n : st[t-1];
            st[t++] = i;
        }
        long long ans = 0;
        for(int i = 0; i < n; i++) {
            ans = max(ans, (long long)h[i]*(R[i]-L[i]));
        }
        printf("%lld\n", ans);
    }
    return 0;
}


相關推薦

POJ2559--Largest Rectangle in a Histogram

題目大意:有n個寬為1,高為h1,h2,h3...hn的長方形從左到右依次排列,形成一個柱狀圖,求最大矩形面積 分析:運用棧來求解。 首先,我們可以得到這樣一個事實,假設最大的矩形的兩個端點為L[i

poj2559 Largest Rectangle in a Histogram單調

題意 有n個矩形,它們在一條水平線上且寬度都為1,長度分別為a[i]。求其中的最大子矩陣。 思考過程 我們從左往右列舉每一個矩形,第i個矩形依次嘗試寬度為1~n-i+1,記錄最低高度和最大面積

POJ2559 Largest Rectangle in a Histogram(單調)

題意: 給出一組矩形的高,求最多能拼成矩形的最大面積,看圖就很清楚了。 要點: 還是單調棧,現在有點感覺了,單調棧大概就是能求出當前值左右的比它大或小的數的範圍。這題用高度作為單調棧,分別往左右找比當

POJ 2559 Largest Rectangle in a Histogram單調

common pst locale str flow bold text function target 【題目鏈接】:click here~~ 【題目大意】: A histogram is a polygon composed of a sequence of

題解報告:poj 2559 Largest Rectangle in a Histogram單調

++i char test case c代碼 ams pac 分享圖片 cas ram Description A histogram is a polygon composed of a sequence of rectangles aligned at a common

[POJ2559]Largest Rectangle in a Histogram ()

題意 如圖所示,在一條水平線上有n個寬為1的矩形,求包含於這些矩形的最大子矩形面積(圖中的陰影部分的面積即所求答案)。 思路 一個很老的,也是一個很好的題目。 維護一個單調棧即可。 不過在洛谷SP1805裡是藍題,還真是意外呢。 程式碼 #include <iostream&

HUD 1506 Largest Rectangle in a Histogram單調的應用題目詳解

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different height

Largest Rectangle in a Histogram單調

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but

POJ-2559 Largest Rectangle in a Histogram(單調)

comm pict mon include max specified out names align Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Tota

POJ2559 Largest Rectangle in a Histogram 單調隊列

sta eight 所有 for 我們 return rec += std 題目大意   有一個直方圖,其所有矩形的底均是1(以後簡稱小矩形)。給出這些矩形的高度,求這些矩形的並集中存在的面積最大的矩形(簡稱大矩形)的面積。 題解   大矩形的高必然一邊等於一個小矩形的高,

POJ 2559 - Largest Rectangle in a Histogram - [單調]

style long push += cst tac ++ tar 開始 題目鏈接:http://poj.org/problem?id=2559 題意: 給出 $n(1 \le n \le 10^5)$ 個寬為 $1$,高為 $h_i(0 \le h_i \le 10^

POJ2559 Largest Rectangle in a Histogram

Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:&nb

Largest Rectangle in a Histogram附上幾組測試資料

Largest Rectangle in a Histogram http://acm.hdu.edu.cn/showproblem.php?pid=1506 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi

【演算法競賽進階指南】POJ2559 Largest Rectangle in a Histogram

重點是單調棧的使用,在這裡簡要地分析一下單調棧 單調棧演算法,時間複雜度是O(n),關鍵思想在於及時排除不可能的選項,保持策略集合的高度有效性和有序性在該題目中如果想要獲得最大子矩形的面積,我們可以嘗試每個矩形的高度作為最終矩形的高度,並且把寬度擴充套件到右邊界得到一個矩形,如果下一個矩形的高度比上一個小,

Largest Rectangle in a Histogram找面積最大的連續塊

Problem DescriptionA histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal

Poj 2559 Largest Rectangle in a Histogram柱形統計圖中的最大矩形面積

 給出一個柱形統計圖中,求其中的最大矩形面積 做完這道題,搜了一下題解大部分基本都是單調棧......然而做之前並不知道這是什麼,其實用遞推也可以做這道題,理解起來比較容易。 用兩個陣列l,r記

HDU-1506 Largest Rectangle in a Histogram(單調,DP)

Largest Rectangle in a Histogram Sample Input 7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0 Sample Output 8 4000 題意: 求直方圖中最大的矩形面積 思路:

HDU - 1506 Largest Rectangle in a Histogram (單調/笛卡爾樹)

return col 一道 scan 卡爾 左右 build new \n 題意:求一個直方圖中最大矩形的面積。 很經典的一道問題了吧,可以用單調棧分別求出每個柱子左右兩邊第一個比它低的柱子(也就相當於求出了和它相連的最後一個比它高的柱子),確定每個柱子的左右邊界,每個柱

poj 2559 Largest Rectangle in a Histogram

hist func opc txt class sse typedef ++ limit // poj 2559 Largest Rectangle in a Histogram 棧 // // n個矩形排在一塊,不同的高度,讓你求最大的矩形的面積(矩形緊挨在一起)

POJ 2559 Largest Rectangle in a Histogram (的運用

cst 所有 left cal turn nta 分享 ons hist A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec