python ccf题解 201312-3 最大的矩形

问题描述

试题编号: 201312-3
试题名称: 最大的矩形
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。



  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。

输入格式

  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。

输出格式

  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。

样例输入

6
3 1 6 5 2 3

样例输出

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))   #从所有局部最大矩形选出全局最大举行

猜你喜欢

转载自blog.csdn.net/SL_logR/article/details/82386173
今日推荐