对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<stdio.h>
int r[100010], l[100010];
__int64 save[100010];//可以把s 定义成int64,也可在最后的运算时强制转化一下!
int main()
{
int n, i, j;
__int64 ans, temp;
while (scanf("%d", &n), n)
{
for (i = 1; i <= n; i++)
{
scanf("%I64d", &save[i]);
l[i] = r[i] = i;
}
save[n + 1] =save[0] = -1;
for(int i=1;i<=n;i++)
{
while(save[l[i]-1]>=save[i])
{
l[i]=l[l[i]-1];
}
}
for(int i=n;i>=1;i--)
{
while(save[r[i]+1]>=save[i])
{
r[i]=r[r[i]+1];
}
}
ans = 0;
for (i = 1; i <= n; i++)
{
temp = save[i]*(r[i] - l[i] + 1) ;
if (temp > ans)ans = temp;
}
printf("%I64d\n", ans);
}
return 0;
}