问题 5571 --切割矩形

5571: 切割矩形★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 317  解决: 173
[提交][状态][命题人:]

题目描述

一面木板墙,每块木板的宽度都是 1,现在想在木板墙上沿着平行于地面的方向切割出一块矩形区域。

如果知道每块木板的高度,如何切出的矩形面积最大?木板墙如下图所示:


图中有 7 块木板,每块木板的高度分别为:2、4、4、3、5、1、1。

尝试后,我们发现最大的矩形就是波浪图案部分所示。

也就是切割了高度为 4、4、3、5 四块木板,形成了一个高度为 3,宽度为 4 的矩形,这个最大面积为 12。

经过尝试,可以发现:切下来的最大矩形,一定是以最大矩形所在的区域中最短的那块木板为矩形的高度值。

这样我们可以枚举每一块木板,每次都以当前木板作为高度。

就是把当前木板当成是切出来的矩形区域中最矮的木板,然后分别向左右延伸,切出此时的最大矩形区域。

当把所有的木板都尝试过一遍后,我们在所有的结果中比较出最大值,这个最大值就是我们要求的最大矩形面积。

如果木板的数量为 n,那么这种算法的时间复杂度接近于 O(n^2)。

但是,如果利用好栈这种数据结构,就能快速的定位左右延伸的最远位置,将算法的时间复杂的降低到 O(n)。

输入

第一行为木板墙的宽度n

第二行n个正整数,分别表示每块木板的高度

输出

样例输入
Copy
7
2 1 4 5 1 3 3
样例输出
Copy
8

提示

来源

[提交][状态]