給乙個直方圖,求直方圖中的最大矩形的面積。
例如,下面這個中直方圖的高度從左到右分別是
2, 1, 4, 5, 1, 3, 3,
他們的寬都是1,
其中最大的矩形是陰影部分。
輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 <= n <= 100000. 然後接下來n個整數h1, …, hn, 滿足 0 <= hi <= 1000000000. 這些數字表示直方圖中從左到右每個小矩形的高度,每個小矩形的寬度為1。 測試資料以0結尾。
sample input:
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
對於每組測試資料輸出一行乙個整數表示答案。
sample output:
8
4000
首先,面積 = 高 * 寬。
所以,得找到合適的高和寬,假設列舉每個矩形的高,然後找到其對應矩形的寬,
最後得到面積的最大值,但是複雜度太高。
這裡引入乙個新的資料結構,單調棧:
顧名思義:單調棧 = 單調 + 棧;
棧大家都不陌生,單調棧就是在棧的基礎上,新增了單調的性質,也就是從棧底到棧頂元素是單調的。
詳情請看一下這篇關於單調棧的介紹:[單調棧](
利用單調棧的性質,正反向兩次遍歷,找出每個高的左右端點。
正向,利用單調非增棧的性質,當棧頂元素的高 > 待入棧元素,pop掉棧頂元素,直到棧頂元素 <= 待入棧元素。
反向,操作與1基本相同,只是從後往前遍歷的。
陣列儲存,因為我們是根據高遍歷找的左右端點,所以在儲存的時候你可以用乙個結構體儲存:
struct zone
;
至於為什麼是long long,考慮極端情況
n = 100000; h[i] = 1000000000;
那麼
面積 = n * h = 1e14
所以 int 會wa掉。
#include
#include
#include
#define max_n 100010
using
namespace std;
struct zone
;zone a[max_n]
;//heights
zone st[max_n]
;//stack
int top =0;
intmain()
for(
int i =
1; i <= n;
++i)
st[++top]
= a[i];}
while
(top >0)
//clear stack
for(
int i = n; i >=1;
--i)
st[++top]
= a[i];}
while
(top >0)
//clear stack
long
long max_s =0;
for(
int i =
1; i <= n;
++i)
cout << max_s << endl;
}}
Week5 A 最大矩形
week5 a 最大矩形 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。input 輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來...
A 最大矩形單調棧解法 Week5作業)
1 是一道經典的單調棧問題 2 利用單調棧計算出當前高度的矩形左右兩邊可以延伸到的寬度 計算出當前矩形左邊第乙個比該矩形高度小的座標 計算出當前矩形右邊第乙個比該矩形高度小的座標 兩者之差,是以當前矩形高度為高的最大矩形的寬度 計算矩形面積,求出最大面積 3 利用乙個單調棧從左往右對矩形高度進行遍歷...
Week5 HomeWork A 最大矩形 單調棧
演算法 思路分析 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,...