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 }

 

posted @ 2012-07-21 17:24  Naix_x  阅读(167)  评论(0编辑  收藏  举报