POJ2559Largest Rectangle in a Histogram【栈】

>Description
如图所示,在一条水平线上有n个宽为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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值