问题描述
试题编号: | 201312-3 |
试题名称: | 最大的矩形 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。 输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。 输出格式 输出一行,包含一个整数,即给定直方图内的最大矩形的面积。 样例输入 6 样例输出 10 |
解题思路
首先找到以其中一个矩形为中心,该矩形高度为最低高度,向左向右增加矩形宽度,得到一个连续矩形组成的的局部最大矩形,最后从中求出全局的最大矩形。
代码
#最大矩形
#输入
n = int(input())
a = list(map(int,input().split()))
'''
另一种思路,搜索矩形i向右的局部最大矩形
tempmax = 0
for i in range(len(a)):
h=a[i]
for l in range(len(a)-i):
if(h>a[i+l]):
h = a[i+l]
if(h == 1):
break
tempmax = tempmax if(tempmax> h*(l+1)) else h*(l+1)
tempmax = tempmax if(tempmax> len(a)) else len(a)
print(tempmax)
'''
b=[]#储存所有局部最大矩形
for i in range(len(a)):
width = 0 #矩形宽度
for j in reversed(range(i)): #向左(反转)搜索左边高度不小于矩形i高度的
if(a[j]>=a[i]):
width+=1 #加左边(含矩形i自身)宽度
else:
break;
for j in range(i,len(a)): #向右搜索高度不小于矩形i高度的
if(a[j]>=a[i]):
width+=1 #加右边宽度
else:
break;
b.append(a[i]*width) #得到包含矩形i自身的局部最大矩形面积
print(max(b)) #从所有局部最大矩形选出全局最大举行