1102 面積最大的矩形
基準時間限制:1 秒 空間限制:131072 kb 分值: 20
難度:3級演算法題
有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下:
面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。
input
第1行:1個數n,表示陣列的長度(0 <= n <= 50000)output第2 - n + 1行:陣列元素a[i]。(1 <= a[i] <= 10^9)
輸出最大的矩形面積input示例
621output示例5623
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個...