HDU1506 Largest Rectangle in a Histogram(简单DP)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

题意:每块的宽度都是1,输入高度,求出最大的一块矩形面积是多少


我的思路是对于每块矩形,制约高度的都是最矮的一块矩形,那么初步思路是通过对每一块矩形的左右进行搜索,(左边+右边的宽度)*这块矩形的高度,就是这块矩形所能得到的最大面积,然后再判断出所有矩形中面积最大的即可,但是这样的做法是很慢的,进行一下优化也许可以,所以我分两步来分别搜索左右边界,如果左边的那块高度>=当前高度的话,就可以直接加上那块的左边界,然后从那块的左边界继续向左搜索,这样就不会产生重复的搜索过程

代码如下:

#include<iostream>  
#include<cstring>  
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 100001;
__int64 h[maxn], l[maxn], r[maxn];
int main()
{
//	freopen("D://input.txt", "r", stdin);
//	freopen("D://output.txt", "w", stdout);
	int n;
	while (scanf("%d", &n) != EOF&&n)
	{
		int i, j;
		for (i = 1; i <= n; i++)
		{
			scanf("%I64d", &h[i]);
			l[i] = r[i] = 1;//初始化左右边界的长度为1
		 }
 		for (i = 2; i <= n; i++)
		{
			j = i;
			while (j > 1 && h[j - 1] >= h[i])//从当前块的左边开始搜索,然后一直搜索左边块的左边界
			{
				l[i] += l[j - 1];
				j = i - l[i] + 1;
			}
		}
		__int64 ans = h[n] * l[n];//最右边的矩形的面积
		for (i = n - 1; i >= 1; i--)
		{
			j = i;
			while (j < n&&h[j + 1] >= h[i])//同样的思路,从右边向左扩展,搜索每块的右边界,然后再计算面积
			{
				r[i] += r[j + 1];
				j = i + r[i] - 1;
			}
			ans = max(ans, h[i] * (l[i] + r[i] - 1));//左右边界初始化都为1,所以要去掉重复的中点
		}
		printf("%I64d\n", ans);
	}
//	printf(".6lf\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}


你可能感兴趣的:(HDU1506 Largest Rectangle in a Histogram(简单DP))