HDU 1506 Largest Rectangle in a Histogram(DP)

题目链接

也是很久以前做过的题了,TLE了5次,和前几天做的POJ那个上的题差不多,开两个标记数组,分别记录左右第一个比他小的位置。

 1 #include <stdio.h>

 2 #include <string.h>

 3 #define N 100001

 4 __int64 p[N],right[N],left[N];

 5 int main()

 6 {

 7     int i,n,j;

 8     __int64 max;

 9     while(scanf("%d",&n)!=EOF)

10     {

11         if(!n) break;

12         max = 0;

13         for(i = 1;i <= n;i ++)

14         scanf("%I64d",&p[i]);

15         for(i = n;i >= 1;i --)

16         {

17             for(j = i+1;j <= n&&p[j] >= p[i];j = right[j])

18             ;

19             right[i] = j;

20         }

21         for(i = 1;i <= n;i ++)

22         {

23             for(j = i-1;j >=1&&p[j] >= p[i];j = left[j])

24             ;

25             left[i] = j;

26         }

27         for(i = 1;i <= n;i ++)

28         {

29            if(max < (right[i]-left[i]-1)*p[i])

30            max = (right[i]-left[i]-1)*p[i];

31         }

32         printf("%I64d\n",max);

33     }

34     return 0;

35 }

 

你可能感兴趣的:(HDU)