天天看点

CCF CSP 201312-3 最大的矩形 (Python)

问题描述

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

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

输入格式

  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。

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

输出格式

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

样例输入

6

3 1 6 5 2 3

样例输出

10

解题的时候出了一些错误后更正,这里把两段代码都放上以作提醒:

# 采用滑动窗口的方式
# 40分   运行超时
a = int(input().strip())
b = [int(z) for z in input().split()]
flag = 0
for width in range(1, a+1):  # 窗口大小
    for i in range(a-width):
        height = min(b[i:i + width])
        S = width * height
        if S > flag:
            flag = S
print(flag)
           
# 100 分,对每一个bar左右看,看到比自己大的就拓展,否则就跳过
a = int(input().strip())
b = [int(z) for z in input().split()]
S = b[0]
for i in range(a):
    gap = 1
    for j in range(i - 1, -1, -1):  # 向左看
        if b[j] >= b[i]:
            gap += 1
        else:
            break
    for k in range(i + 1, a):  # 向右看
        if b[k] >= b[i]:
            gap += 1
        else:
            break
    S = max(S, gap * b[i])
print(S)