思路:
對於每一塊木板,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;
}