Week5 A 最大矩形(單調棧)

2021-10-04 08:15:26 字數 1896 閱讀 1695

給乙個直方圖,求直方圖中的最大矩形的面積。

例如,下面這個中直方圖的高度從左到右分別是

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,...