您的位置:首页 > 其它

HDU 1506 Largest Rectangle in a Histogram

2013-08-09 21:37 381 查看
思路:

对于每一块木板,Area=height[i]*(j-k+1)  其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,

利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去…

#include <cstdio>
#include <cstring>
#include <cstdlib>

__int64 n , l[100005] , num[100005] , r[100005];

void solve()
{
__int64 i , j;
num[0] = num[n+1] = -1;
for (i = 1 ; i <= n ; i++)
{
l[i] = i;
while (num[l[i]-1] >= num[i])
l[i] = l[l[i]-1];
}
for (i = n ; i > 0 ; i--)
{
r[i] = i;
while (num[r[i]+1] >= num[i])
r[i] = r[r[i]+1];
}
__int64 ans = 0;
for (i = 1 ; i <= n ; i++)
{
__int64 tmp = num[i]*(r[i]-l[i]+1);
if (tmp > ans)ans = tmp;
}
printf("%I64d\n",ans);
}

int main()
{
while (scanf("%I64d",&n) , n)
{
for (int i = 1 ; i <= n ; i++)
scanf("%I64d",num+i);
solve();
}
//    system("pause");
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: