天天看點

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)