描述:
在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。 例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度。
你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。
思路:
我们可以利用暴力破解来解决该题,某一点开始向他的两个方向开始搜索,看看他能向两边延伸到多长的距离,最后就是该长度乘以该点的高度即可。
实现代码:
01 | # include <iostream> |
02 | # include "stdio.h" |
03 |
04 | #define N 100005 |
05 | #define INF 999999999 |
06 |
07 | using namespace std; |
08 |
09 | int Len[N]; |
10 | long long ans,Max; |
11 |
12 | int main() |
13 | { |
14 | int n,i,j; |
15 | int ls,rs; |
16 |
17 | while (scanf( "%d" ,&n)==1&&n) |
18 | { |
19 | ls=rs=0; |
20 | ans=-INF; |
21 |
22 | for (i=0;i<n;i++) |
23 | { |
24 | scanf( "%d" ,&Len[i]); |
25 | } |
26 |
27 | for (i=0;i<n;i++) |
28 | { |
29 | ls=rs=0; //分别能向左边ls,右边rs两端能够扩展的最大长度 |
30 |
31 | for (j=i-1;j>=0;j--) |
32 | { |
33 | if (Len[j]>=Len[i]) |
34 | { |
35 | ls++; |
36 | } |
37 | else |
38 | { |
39 | break ; |
40 | } |
41 | } |
42 |
43 | for (j=i+1;j<=n;j++) |
44 | { |
45 | if (Len[j]>=Len[i]) |
46 | { |
47 | rs++; |
48 | } |
49 | else |
50 | { |
51 | break ; |
52 | } |
53 | } |
54 |
55 | Max=(ls+rs+1)*Len[i]; |
56 |
57 | if (ans<Max) |
58 | ans=Max; |
59 | } |
60 |
61 | cout<<ans<<endl; |
62 | } |
63 |
64 | return 0; |
65 | } |