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 }

优质内容筛选与推荐>>
1、Poj 3259 Wormholes 负环判断 SPFA & BellmanFord
2、自动备份sqlexpress 数据库脚本
3、iOS 实现Tabbarcontroller中间自定义样式 最简单的方法
4、Ajax内部交流文档
5、[转]熟悉 CMake(二)—— 以一个实例说明 CMakeLists.txt 文件的编写


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号