POJ2559Largest Rectangle in a Histogram【栈】

>Description
如图所示,在一条水平线上有n个宽为1、高度不等的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案)。
POJ2559Largest Rectangle in a Histogram【栈】_第1张图片


>Input
有多组测试数据,每组数据占一行。输入零时读入结束。
每行开头为一个数字n(1<=n<=100000),接下来在同一行给出n个数字h1h2…hn(0<=hi<=1000000000)表示每个矩形的高度。

>Output
对于每组数据,输出最大子矩阵面积,一组数据输出一行。


>Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

>Sample Output
8
4000


>解题思路
开两个栈,一个栈记录每个矩形的高度,栈要保持升调排序,如果遇到了比栈最后一个数小的高度,就枚举找到这个高度可以放的位置,后面的全部删去,同时要记录一下答案;第二个栈就是记录当前数掩盖过多少个数(加上本身)。


>代码

#include<iostream>
#include<cstdio>
using namespace std;
struct ooo
{
	int c,p;
}st[100005];
int n,a,keyl;
long long ans;
int main()
{
	scanf("%d",&n);
	while(n!=0)
	{
		keyl=ans=0; //keyl记录栈的长度,ans为答案
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a);
			int w=0;
			if(a<st[keyl].c)
			{
				while(a<st[keyl].c)
				{
					w+=st[keyl].p; //累计覆盖的个数
					ans=max(ans,(long long)w*st[keyl].c); //记录答案
					keyl--;
				}
			}
			st[++keyl].c=a; st[keyl].p=w+1; //加入栈
		}
		int w=0;
		for(int i=keyl;i>=1;i--)
		{
			w+=st[i].p;
			ans=max(ans,(long long)w*st[i].c);
		}
		printf("%lld\n",ans);
		scanf("%d",&n);
	}
	return 0;
} 

你可能感兴趣的:(栈)