HDU 1506 Largest Rectangle in a Histogram

思路:

对于每一块木板,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;
}


 

发布了98 篇原创文章 · 获赞 1 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章