当前位置:   article > 正文

HDU 1506 Largest Rectangle in a Histogram (DP或单调栈+笛卡尔树)

HDU 1506 Largest Rectangle in a Histogram (DP或单调栈+笛卡尔树)

传送门

题目大意:

有N条的长条状的矩形,宽度都为1,第i条高度为Hi,相邻的竖立在x轴上,求最大的子矩形面积

DP思路及代码

求出当前点能够到达的最左边和最右边的位置,答案就是(最右边-最左边)*当前高度

ll l[maxn],r[maxn],a[maxn];
//l[i]记录i点能够到达最左边的位置
//r[i]记录i点能够到达最右边的位置 
//最后答案就是(最右边-最左边+1)*a[i] 
int main(){
	int n;
	while(~scanf("%d",&n)){
		if(n==0)break;
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		}
		l[1]=1;r[n]=n; 
		for(int i=2;i<=n;i++){
			int tmp=i;
			while(tmp>=1&&a[i]<=a[tmp-1]){
				tmp=l[tmp-1]; ///因为a[i]<=a[tmp-1],所以可以直接跳到tmp-1的l上
			}
			l[i]=tmp;
		}
		for(int i=n-1;i>=1;i--){
			int tmp=i;
			while(tmp<n&&a[i]<=a[tmp+1]){
				tmp=r[tmp+1];
			}
			r[i]=tmp;
		}
		ll maxx=-1;
		for(int i=1;i<=n;i++){
			maxx=max(maxx,(r[i]-l[i]+1)*a[i]);
		}
		printf("%lld\n",maxx);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/776852
推荐阅读
相关标签
  

闽ICP备14008679号