码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1506 Largest Rectangle in a Histogram【DP】

时间:2015-02-10 10:26:27      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题意:坐标轴上有连续的n个底均为1,高为h[i]的矩形,求能够构成的最大矩形的面积。

学习的别人的代码 @_@

看底的坐标怎么找的看了好一会儿---

记l[i]为矩形的底的左边的坐标,就将它一直向左扩展

记r[i]为矩形的底的右边的坐标(倒着找,从n开始找,题解里面还着重强调了要倒着找,要不然就体现不出优化了)至于那个优化,我想的是,每一次算r[i]的时候,它前面的一个r[i]就是覆盖得最远的了,可以减少计算(用了一组样例试验)

然后就枚举找出面积的最大值--

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;
int l[100005],r[100005],h[100005];
int main()
{
	int n,i;
	while(scanf("%d",&n)!=EOF&&n)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&h[i]);
			l[i]=r[i]=i;
		}
		
		for(i=1;i<=n;i++)
		while(l[i]>1&&h[l[i]-1]>=h[i])
		l[i]=l[l[i]-1];
		for(i=n;i>=1;i--)
		while(r[i]<n&&h[r[i]+1]>=h[i])
		r[i]=r[r[i]+1];
		__int64 ans=-10000;
		__int64 tmp;	
		for(i=1;i<=n;i++)
		{
			tmp=(__int64)(r[i]-l[i]+1)*h[i];
			if(tmp>ans)
			ans=tmp;
		}
		printf("%I64d\n",ans);		
	}
}

  

HDU 1506 Largest Rectangle in a Histogram【DP】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4283048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!