Largest Rectangle in a Histogram 常用技巧 stack的运用

                        Largest Rectangle in a Histogram

 

 

给出一些连续的长度为1的长方形。问所能构成的矩形的最大面积是多少?

设最大的面积的左端点为L,又端点为R,H=min(h[i]),    i>=L&&i<=R;   我们分析h[L-1],一定有h[L-1]<h[L],不然的话可以扩充。  同理  一定有 h[R]>h[R+1]

我们以每个高度去构建长方形。找出  [L,R].  我们要找出j<=i  &&a[j]<=a[i]的最大的j;   根据问题的性质。   假设  a[1]>=a[2]的话,现在i>2,   如果a[2]<a[i]的话,a[1]需要考虑了。如果a[2]>=a[i]的话,a[1]一定大于a[i]。所以可以构建单调stack.

R 同样处理。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <list>
13 #include <iomanip>
14 #include <cstdlib>
15 #include <sstream>
16 using namespace std;
17 typedef long long LL;
18 const int INF=0x5fffffff;
19 const double EXP=1e-6;
20 const int MS=100005;
21 
22 int n;
23 int deq[MS];
24 int a[MS];
25 int L[MS],R[MS];
26 int s,t;
27 
28 int main()
29 {
30      while(scanf("%d",&n)&&n)
31      {
32          for(int i=0;i<n;i++)
33              scanf("%lld",&a[i]);
34          s=t=0;
35          for(int i=0;i<n;i++)
36          {
37              while(t>0&&a[deq[t-1]]>=a[i])
38                  t--;
39             L[i]=t==0?0:(deq[t-1]+1);
40             deq[t++]=i;
41         }
42         s=t=0;
43         for(int i=n-1;i>=0;i--)
44         {
45             while(t>0&&a[deq[t-1]]>=a[i])
46                 t--;
47             R[i]=t==0?n:deq[t-1];   //[L,R)
48             deq[t++]=i;
49         }
50         LL ans=0LL;
51         for(int i=0;i<n;i++)
52             ans=max(ans,(LL)a[i]*(R[i]-L[i]));
53         printf("%lld\n",ans);
54     }
55     return 0;
56 }

 

posted @ 2015-04-09 20:42  daydaycode  阅读(161)  评论(0编辑  收藏  举报