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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章