hdu 1506 Largest Rectangle in a Histogram DP 单调队列

//考察点:动态规划,又有说是单调队列(还不了解)
//思路:为每一个点记录可以左最远延伸到的位置,和向右最远延伸到的位置
//但是不能暴搜,会超时的。具体见下面的代码
//提交情况:1.TLE 多次,原因:h[0]=h[n+1]设置成了0,会出现问题
//提交情况:2.WA 多次,原因:必须要将数组改成__int64类型的才能通过
//收获:使用l[i]=l[l[i]-1]这样的语句可以使滑动速度加快
//AC code
#include
int l[100005];
int r[100005];
__int64 h[100005];
int n;

int main(){
	while(scanf("%d",&n)&&n){
		int i;
		for(i=1;i<=n;i++){
			scanf("%I64d",&h[i]);
			l[i]=r[i]=i;
		}
		h[0]=h[n+1]=-1;
		for(i=1;i<=n;i++){
			while(h[l[i]-1]>=h[i]){
				l[i]=l[l[i]-1];
			}
		}
		for(i=n;i>=1;i--){
			while(h[r[i]+1]>=h[i])
				r[i]=r[r[i]+1];
		}
		__int64 Max=-1;
		__int64 tmp;
		for(i=1;i<=n;i++){
			tmp=h[i]*(r[i]-l[i]+1);
			if(tmp>Max)
				Max=tmp;
		}
		printf("%I64d\n",Max);
	}	
	return 0;
}

你可能感兴趣的:(HDU)