POJ2559 Largest Rectangle in a Histogram(單調棧)
阿新 • • 發佈:2019-02-09
題意:
給出一組矩形的高,求最多能拼成矩形的最大面積,看圖就很清楚了。
要點:
還是單調棧,現在有點感覺了,單調棧大概就是能求出當前值左右的比它大或小的數的範圍。這題用高度作為單調棧,分別往左右找比當前高度大的數的範圍,最後求個面積即可。
15402130 | 2559 | Accepted | 1440K | 157MS | C++ | 823B | 2016-04-17 10:59:21 |
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 100005 int a[maxn],stack[maxn]; int l[maxn], r[maxn]; int main() { int n, i, j,top; while (scanf("%d",&n)&&n) { for (int i = 1; i <= n; i++) scanf("%d", &a[i]); top = 0; for (i = 1; i <= n; i++) { while (top > 0 && a[stack[top - 1]] >= a[i])//尋找左邊界 top--; l[i] = top == 0 ? 1 : stack[top-1]+1;//如果大於棧頂,要+1來使左邊界位於當前值,同樣小於棧頂也要+1,因為棧頂肯定不能在邊界內 stack[top++] = i; } top = 0; for (i = n; i >= 1; i--) { while (top >0&&a[stack[top - 1]] >= a[i])//倒序尋找右邊界 top--; r[i] = top == 0 ? n : stack[top-1]-1; stack[top++] = i; } long long max = -1; for (i = 1; i <= n; i++) if (max < (long long)a[i] * (r[i] - l[i]+1))//邊界之差要+1 max = (long long)a[i] * (r[i] - l[i]+1); printf("%lld\n", max); } return 0; }