题目大意:
有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);
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » HDU 1506 Largest Rectangle in a Histogram (DP或单调栈+笛卡尔树)
发表评论 取消回复