這題意思很簡單...就是給一排並列寬為1,長度輸入資料的影象..問能找到的最大矩形面積是多大...
思路也很簡單...基本框架是: 從一邊做到另一邊..維護乙個單調的棧..棧頂的矩形邊最長..棧底的最短...當前掃到某個位置的矩形..就判斷彈棧..直道棧頂的矩形長小於等於當前矩形..
但是..細節阿...首先...不是從一邊做到另一邊就完了..還要從另一邊再做回來~~要做兩次才能得到結果...再乙個...注意這種情況阿..:
3 2 1 2
判斷的時候稍不細心答案就是2了...但顯然答案是3的說...因為在做的時候..首先是2進棧..然後到1..但是1又把2彈掉了...發現開始的處理顯然是欠考慮的...雖然長度為2的是要出棧..但是2的這個位置不能丟棄..要記錄傳遞給第2位的1~~~~
program:
#include#include#include#include#include#includeusing namespace std;
struct node
mystack[100005];
__int64 ans,x,k,n,p,a[100005],t;
int main()
if (!k || mystack[k].h!=x)
} printf("%i64d\n",ans);
} return 0;
}
poj-2559 維護單調棧.細節阿細節
POJ2559 單調遞增棧
題意大概講述的是有許多寬度為1的矩形,問你最大面積的矩形是多少。更具模型可以得知,要是有乙個高度較小塊進入後,無法給前面高度較高的塊增加同一高度的面積。這時候就可以處理前面的高塊,因為現在的塊是較低的,已經沒辦法可以接到後面較高的。所以刪去前面所有比當前塊高的塊,並且處理這些塊可以得到的面積。最後一...
POJ2559 單調佇列
題目大意 給定n個連續的寬度為1的矩形,求最大子矩形面積。求一遍每個點向右延伸的最長長度,再反著求一遍每個點向左延伸的最長長度,兩個加起來 要減去重複計算的本身長度 取最優解。這題為什麼會wa呢?因為可能會有長度為0的矩形,這時候必須往佇列裡push個 1才能把它彈出來。而如果不把它彈出來,它的延伸...
poj 2559 最大矩形面積(單調棧)
題目 輸入乙個整數n,代表有n個 1 寬度 h i 高度 的矩形。接下來n個數依次給定乙個矩形高度的高度h i i n 求 在給定的依次排列的這堆矩形構成的圖形裡用乙個矩形圈出最大的乙個矩形,求該最大矩形面積。include include include using namespace std t...