您的位置:首页 > 其它

HDU1506--Largest Rectangle in a Histogram (动态规划)

2013-11-16 09:38 260 查看
用动态规划的思想分别求出当前建筑向左边所能延伸的递减的(相等的也行)建筑高度的左边界和当前建筑向右边所能延伸的递减的(相等的也行)建筑高度的右边界。由右边界和左边界,即可得出长度,面积就是长度*高度。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#define LL __int64
#define maxn 100005
using namespace std;

struct Build
{
LL height;
LL left;
LL right;
}b[maxn];

int main()
{
LL n;
while(scanf("%I64d",&n),n)
{
for(LL i=1;i<=n;i++)
{
scanf("%I64d",&b[i].height);
b[i].left=i,b[i].right=i;
}
b[0].height=-1,b[n+1].height=-1;
for(LL i=1;i<=n;i++)
{
while(b[i].height<=b[b[i].left-1].height)
{
b[i].left=b[b[i].left-1].left;
}
}
for(LL i=n;i>=1;i--)
{
while(b[i].height<=b[b[i].right+1].height)
{
b[i].right=b[b[i].right+1].right;
}
}
LL max=-1;
for(LL i=1;i<=n;i++)
{
LL sum=(b[i].right-b[i].left+1)*b[i].height;
if(sum>max)
max=sum;
}
printf("%I64d\n",max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: