51nod 1102 面積最大的矩形

2021-08-18 08:41:00 字數 2217 閱讀 4681

1102 面積最大的矩形

基準時間限制:1 秒 空間限制:131072 kb 分值: 20 

難度:3級演算法題

有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下:

面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。

input

第1行:1個數n,表示陣列的長度(0 <= n <= 50000)

第2 - n + 1行:陣列元素a[i]。(1 <= a[i] <= 10^9)

output

輸出最大的矩形面積
input示例

621

5623

output示例

10
思路:一:dp: 

dp1[i]: 表示 從a[i]向左邊連續不小於 a[i]高度的最小下標值

dp2[i]:  表示 從a[i]向右邊連續不小於 a[i]高度的最大下標值

對於 dp1: 若 a[i]>a[i-1] 則 dp1[i]=i;否則 dp1[i]=dp1[i-1],然後繼續和 a[dp1[i-1]-1] 比較 ,若a[i]小於等於則 繼續反覆比較直到 a[i]對於 a[x] 或者x<=0;(a[1->n])為止。對於dp2也是如此只不過是和 右邊的比較

這樣就知道了 對於 a[i]為高的矩形的寬度 w=dp2[i]-dp1[i]+1,因此可得到最大矩形面積 

二:stack

用兩個棧 stack1,stack2分別記錄 以a[i]為高的矩形的寬的a[i]左右邊長度。

對於 stack1 記錄 以a[i]為高的矩形的寬的a[i]左邊長度。對於 a[i],若 a[i]>stack1.top()則入棧,說明左邊長度為l[i]=0;否則 l[i]+=l[stack1.top()]+1; 再出棧,a[i]繼續和 棧頭比較

對於 stack2也是如此,這樣 就知道 以a[i]為高的矩形的寬的a[i]左右邊長度l[i],r[i],ans=max

三: stack

第二種是用二個棧來計算 l[i],r[i],實際上可以只用 乙個棧就可以維護。

棧stack 儲存a[i]的最左邊界下標t,其下標對應的a[t]=a[i],這樣只要找到 a[i]的最右下標即可求出其矩形面積.

遍歷 a[i],若a[i]>a[stack.top()],則 a[i]對應的矩形最左端就是其自己,因此只要入棧即可

而若 a[i]<=a[stack.top()],則 要找到a[i]對應的矩形最左端t. 那麼就要與 棧頂 ti 對於的a[ti]比較,若a[i]<=a[ti],則令t=ti,而對於a[ti]來說,i就是它的最右端,此時儲存它的矩形面積 ans=max(ans,a[t]*(i-t));直到 a[i]>a[ti] 此時 t就是 最左端下標;    修改 令 a[t]=a[i],再將 t 入棧,在所有a入棧後,還要將棧中的元素求其面積,因此只要將 a[n+1]=0也進行比較即可。(a[1->n])

code 1:

#includeusing namespace std;

typedef long long ll;

const int max_n=50005;

int n;

ll a[max_n];

int dp1[max_n],dp2[max_n];

int main()

for(int i=1;i<=n;++i)

ll ans=0;

for(int i=1;i<=n;++i)

ans=max(ans,a[i]*(dp2[i]-dp1[i]+1));

cout

#include#includeusing namespace std;

typedef long long ll;

struct node;

const int max_n=50005;

int n;

ll a[max_n];

int l[max_n],r[max_n];

stacksta1,sta2;

int main()

else if(a[i]

}sta.push(t);

a[t]=a[i];

} cout<

return 0;

}

51NOD 1102 面積最大的矩形

有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。input 第1行 1個數n,表示陣列的長度 0 n 50000 第2 n 1行 陣列元素a i 1 a i 10 9 output ...

51nod 1102 面積最大的矩形

1102 面積最大的矩形 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。input 第1行 1個...

51 nod 1102 面積最大的矩形

1102 面積最大的矩形 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。input 第1行 1個...