1. 程式人生 > >HDU-1506 Largest Rectangle in a Histogram(單調棧,DP)

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

題意:

求直方圖中最大的矩形面積

思路:

有兩種解法,個人感覺DP稍簡單一點,單調棧不容易理解。

(一)DP

通過兩次DP,找到每個的左側和右側比本身高的連續的位置,最後去找最大面積。第一遍,先從左到右,然後找每個數的左側,記錄下比本身高的連續的邊界位置,為L。第一遍找到了全部的L。第二遍開始找每個位置的R,從右到左開始,找每個位置的右側比本身高的連續的邊界位置為R。這時每個位置的L,R都求出了。開始判斷最大值。
第一遍找L。

		for(int i = 2; i <= n; i++) {
			int t = i;
			while(t > 1 && a[t-1] >= a[i]) {
				t = l[t-1];
			}
			l[i] = t;
		}

第二遍找R.

		for(int i = n-1; i >= 1; i--) {
			int t = i;
			while(t < n && a[t+1] >= a[i]) {
				t = r[t+1];
			}
			r[i] = t;
		}
程式碼:
#include<bits/stdc++.h>
using namespace std; const int maxn = 100000+10; long long a[maxn]; long long l[maxn], r[maxn]; int main() { int n; while(cin >> n && n) { for(int i = 1; i <= n; i++) { scanf("%lld", &a[i]); } l[1] = 1; r[n] = n; for(int i = 2; i <= n; i++) { int t = i; while(
t > 1 && a[t-1] >= a[i]) { t = l[t-1]; } l[i] = t; } for(int i = n-1; i >= 1; i--) { int t = i; while(t < n && a[t+1] >= a[i]) { t = r[t+1]; } r[i] = t; } long long maxx = -1; for(int i = 1; i <= n; i++) { long long sum = (r[i] - l[i] + 1)*a[i]; if(sum > maxx) maxx = sum; } cout << maxx << endl; } return 0; }

(二) 單調棧

單調棧的思想是:用一個棧來儲存下標,遇到比棧中下標對應的值大的高度時,這時把這個下標進棧,保證棧中下標的高度為遞增的(可以相等)。遇到比棧中下標對應值小的高度時,出棧並就計算面積(也就是棧頂元素的高度*(i-出棧後的棧頂-1),非空棧時),如果i == n時,且為空棧時這時面積為(height[棧頂] * i),和res比較,取最大值。
為了保證有結束狀態,要在最後中壓入一個0,height[n] = 0;
看例子比較清晰:
height=[2,1,5,6,2,3]

  1. 剛開始棧為空,壓入下標0;當i=1時,不滿足height[1] >= height[0],下標出棧,棧為空,計算面積res = height[0](1-0) = 2;
    在這裡插入圖片描述
    2)高度1,5,6為依次遞增的,所以對應下標依次壓棧;此時棧元素有(1,2,3)。當i = 4時,不滿足height[4] >= height[3],所以此時棧頂元素3出棧,計算此時面積res = height[3]
    (4-3)=6。
    在這裡插入圖片描述
    3)當前棧為(1,2),棧頂為2,i=4,不滿足height[4] >= height[2],所以棧頂2出棧,計算此時面積res=height[2]*(4-2)=10
    在這裡插入圖片描述
    4)當前棧為(1),棧頂為1,i=4,滿足height[4] >= height[1],所以i=4進棧,i++;棧為(1,4), i=5時,滿足height[5] >= height[4],所以5進棧,棧為(1,4,5),i++;i=6,此時height[6]=0,不滿足height[6] >= height[5],5出棧,計算面積res=(6-5)*height[5]=3;
    在這裡插入圖片描述
    5)當前棧為(1,4),棧頂為4,i=6,不滿足height[6] >= height[4],所以4出棧,計算面積res=(6-4)*height[4]=4;
    在這裡插入圖片描述
    6)當前棧為(1),棧頂為1,i=6,不滿足height[6] >= height[1],所以1出棧,此時為空棧,這次計算面積比較特殊res=height[1]n=16=6;
    在這裡插入圖片描述
    參考部落格:https://www.cnblogs.com/love-yh/p/7182920.html
程式碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
long long height[maxn]; 
int main()
{
    int n;
    while(cin >> n && n) {
        for(int i = 0; i < n; i++){   
            cin>>height[i];
        }
        height[n] = 0;
        stack<int> s;
        long long maxx = 0; //這裡一定要maxx = 0   否則錯。。。。 
        long long sum = 0;
        for(int i = 0; i <= n; ++i) {
            if(s.empty() || (height[s.top()] <= height[i])) {
                s.push(i);
            }
            else {
                long long p = s.top();
                s.pop();
                if(s.empty()) 
					sum = height[p]*i;
				else
					sum = height[p]*(i-s.top()-1);
                
                if(sum >= maxx)
                    maxx = sum;
                --i;
            }
        }
        cout << maxx << endl;        
    }
    
    return 0;
} 



相關推薦

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 &&HDU 1506 Largest Rectangle in a Histogram && 51nod 1102 面積最大的矩形 單調的應用

題目大意:POJ 2559 &&HDU 1506 && 51NOD 1102這三個題其實都是一個題,有N個矩形,寬度都為1,給出N個矩形的高度,求由這N個矩形組成

hdu-1506-Largest Rectangle in a Histogram(dp)

題目:http://acm.hdu.edu.cn/showproblem.php?pid=1506   題意:給出一個n個寬為1的長方形,之後給出第i個長方形的高a[i]。求出由n個長方形組成的圖形所能構成的面積最大的長方形。   這道題曾經用單調棧做過,想了解的

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

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(單調)

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

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

HUD 1506 Largest Rectangle in a Histogram

problem ssi member img 個數 accept fin character ref Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Lim

POJ2559 Largest Rectangle in a Histogram 單調隊列

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

HDU1506 / POJ2339 Largest Rectangle in a Histogram 單調遞減

1.什麼是單調棧 具有單調性和棧的性質 單調遞減棧就是從棧底到棧頂是單調遞減的 單調遞增棧就是從棧底到棧頂是單調遞增的 2.單調棧解決的問題 以自己為最小值,找到最長的區間;單調遞增棧 以自己為最大值,找到最長的區間;單調遞減棧 給定一個區間找到這個區間的最大值或

Largest Rectangle in a Hitogram-單調の入門好題

單調棧的好題 題目連結 題目是求最大矩形面積 1.BF思路 可以想到最後大矩形的上邊界一定是某個小矩形的頂 那麼我們就列舉每一個小矩形, 將其頂作為限制條件儘可能地向兩邊擴充套件 複雜度\(O(n^2)\) 2.單調棧做法 如圖,黑色為最終要求的矩形 我們可以維護一個單調遞增棧

POJ2559--Largest Rectangle in a Histogram

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

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

E - Largest Rectangle in a Histogram POJ - 2559 -單調第二彈

  E - Largest Rectangle in a Histogram  POJ - 2559  維護一個非遞增單調棧,對於每個矩形,我們求出它向左向右分別能延伸的長度,然後乘以它的高度。 這就是以當前矩形為最低高度可以得到的最大

2559 Largest Rectangle in a Histogram單調

Time limit 1000 ms Memory limit 65536 kB A histogram is a polygon composed of a sequence of rectangles aligned at a common base lin

【poj 2559 Largest Rectangle in a Histogram】【單調

【連結】 【題意】 在一條水平線上有若干緊挨的矩形,求包含於這些矩形的並集內部的最大的矩形的面積(矩形個數<=1e5) 【分析】我們先考慮,若矩形的高度從左往右單調遞增,那麼答案顯而易見嘗試以每個矩形的高度為最終矩形的高度,並把寬度延伸到右邊界,得到一個矩形,

POJ 2559-Largest Rectangle in a Histogram 解題報告 【笛卡爾樹與單調

POJ 2559-Largest Rectangle in a Histogram 解題報告 【笛卡爾樹與單調棧】 Description   A histogram is a polygon composed of a sequence of rectang

單調】hdu1506 Largest Rectangle in a Histogram ----簡單瞭解單調

這個題是可以用動態規劃,或者是單調棧、其實實質是差不多的; 1. 什麼是單調棧 單調棧就是保持了單調性和棧的性質; 單調遞增的棧就是從棧尾到棧頂是單調遞增的; 2. 單調棧能夠解決的問題 1) 以