問題描述:
在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1<=i<=n)個矩形的高度是hi,這n個矩形構成了乙個直方圖,例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3
請找出能放在給定直方圖裡面積最大的矩形,他的邊要與座標軸平行。
輸入格式:第一行包含乙個整數n,即矩形的數量(1<=n<=100)
第二行包含n個整數h1,h2,…hn,相鄰的數之間由空格分隔(1<=hi<=10000)hi是第i個矩形的高度
輸出格式:輸出一行,即直方圖內最大矩形的面積
樣例輸入
63 1 6 5 2 3
樣例輸出
10題解:就是在這個形狀中找出面積最大的矩形,對於上圖,裡面最大的面積就是第三列和第四列,寬為2,高為5,面積是10,
#include
"iostream"
#include
"stack"
using
namespace std;
const
int n=
1000
;int h[n+1]
;int
main()
h[n]=0
; stack<
int> s;
for(
int i=
0;i<=n;i++)}
cout<
return0;
}
在這個裡面 if()執行的是能夠入棧的元素都是當前高度最高的那一列的橫座標,如果後面的縱座標比當前的低,則執行else中temp=s.top(); 去除棧頂元素後,此時棧頂元素是比前乙個取出的棧頂元素小的那一列的橫座標(),h[temp]*(s.empty()?i:i-s.top()-1)中h[temp]是最大的那乙個橫座標的高,如果棧中空時,則乘以i,不為空則乘以i-s.top()-1,這裡應該時i - (s.top()+1),因為從陣列從0開始計算,
其實i–;的作用就是為了一直把棧頂pop()直到 小於等於h[i],這樣之前大於h[i]的橫座標將全部被pop(),如果棧中每乙個元素都比h[i]要大,那麼這個i肯定是剛剛才入棧的元素且棧中只有他乙個元素。這樣先把自己pop()出來,再乘以i,即圖的橫座標最大值n
所以前面定義陣列時候定義成h[n+1],而且再for迴圈中i的迴圈條件是i<=n
最大的矩形
最大的矩形問題 poj2559 題解 單調棧做 給定從左到右多個矩形,已知這此矩形的寬度都為1,長度不完全相等。這些矩形相連排成一排,求在這些矩形包括的範圍內能得到的面積最大的矩形,列印出該面積。所求矩形可以橫跨多個矩形,但不能超出原有矩形所確定的範圍。建立乙個單調遞增棧,所有元素各進棧和出棧一次即...
最大的矩形
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 2,1,5,6,2,3 圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。示例 輸入 2,1,...
ACM 最大的矩形
試題編號 3 試題名稱 最大的矩形 時間限制 1.0s 記憶體限制 256.0mb 問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是hi。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3。請找出能放在給定直方圖裡面積最大...