1. 程式人生 > >POJ2559 Largest Rectangle in a Histogram(單調棧)

POJ2559 Largest Rectangle in a Histogram(單調棧)

題意:

給出一組矩形的高,求最多能拼成矩形的最大面積,看圖就很清楚了。

要點:

還是單調棧,現在有點感覺了,單調棧大概就是能求出當前值左右的比它大或小的數的範圍。這題用高度作為單調棧,分別往左右找比當前高度大的數的範圍,最後求個面積即可。

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;
}