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

!HDU 1506 Largest Rectangle in a Histogram-dp-(dp降低时间复杂度)

时间:2015-06-23 10:17:49      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:hdu   dp   

题意:有宽度相同高度不同的长方体挨着放在一起,求能构成的面积最大的长方体

分析:也是思维的转换。这题的主思路不是dp,dp只是起一个辅助作用。具体做法:枚举每个长方体,求以这个长方体的高度为高的最大的长方体面积,不断更新答案。用一个l[i]r[i]数组表示第i个矩形的左右比它高的远的位置,所以面积 s=a[i]*(r[i]-l[i]+1).但是直接两重循环会超时,这时用了一点dp的思想,这里用的不是dp递推的思想,而是dp保存中间结果降低时间复杂度的思想。虽然也是两重循环,但是由于dp[]的关系,就跳过了很多重复的比较步骤。

注意积累这题的主思路,还有dp的用法。

代码:

#include<iostream>
#include<cstring>
using namespace std;
long long n,a[100005];
long long mx,sum;
int l[100005],r[100005];
long long max(long long i,long long j)
{
	return i>j?i:j;
}
void DP()
{
	mx=0;
	for(int i=0;i<n;i++) l[i]=i,r[i]=i;
	for(int i=1;i<n;i++){
		int t=i;
		while(t>0&&a[t-1]>=a[i])
		   t=l[t-1];
		l[i]=t;
	}
	for(int i=n-2;i>=0;i--){
		int t=i;
		while(t<n-1&&a[i]<=a[t+1]) 
		   t=r[t+1];
		r[i]=t;
	}
	for(int i=0;i<n;i++){
		sum=a[i]*(r[i]-l[i]+1);
		mx=max(sum,mx);
 	}
}
int main()
{
	while(cin>>n){
		if(!n) break;
		for(int i=0;i<n;i++) cin>>a[i];
		DP();
		cout<<mx<<endl;
	}
}


!HDU 1506 Largest Rectangle in a Histogram-dp-(dp降低时间复杂度)

标签:hdu   dp   

原文地址:http://blog.csdn.net/ac_0_summer/article/details/46599147

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