最大的矩形 201312 3

2021-07-11 08:34:28 字數 1356 閱讀 6455

問題描述

在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是h

i。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。

請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積是10。

輸入格式

第一行包含乙個整數n,即矩形的數量(1 ≤ n ≤ 1000)。

第二行包含n 個整數h

1, h

2, … , h

n,相鄰的數之間由空格分隔。(1 ≤ h

i ≤ 10000)。h

i是第i個矩形的高度。

輸出格式

輸出一行,包含乙個整數,即給定直方圖內的最大矩形的面積。

樣例輸入6

3 1 6 5 2 3

樣例輸出

10思路:做這道題的原因是,我同學去科大參加 華為2023年實習生筆試,這道題恰好是第2題,算簡單題了。好可惜,為啥子我沒去報名,不然就過了一輪筆試了。

這道題求的是最大的矩形面積,每個小方塊的面積都是1。假設現在前面有了n列的矩陣,當我在放第n+1列時,最大值只可能在以下幾種情況中選擇:

1.第n+1列的面積最大

2.之前的最大值也是加了這一列的最大值

3.第三種情況稍複雜一點,就是用乙個高度為line的直線去切割,當line=1時,看一下line以下方格的最大值,注意這裡遇到h[j]

這道題我覺得應該算動態規劃的例子。用f(i) 表示前i列的最大值,則f(i+1) = max( f(i), h[i+1], max temp(1<=line<=h[i+1]))

#include using namespace std;

#define max 1010

int main()

int line = 0; //line是劃線,平行於x軸的線

for(i=0;i=0;j--)

int temp = num * line;

ans = max(ans,temp);

line++;}}

}cout<

後來在思考的過程中,又想到一種方法。從第一列開始遍歷,當固定i=0時,依次加入後面的列,組成的臨時矩形高度是這幾列最小的高度。遍歷完一遍之後,記錄i=0時的最值,之後再求出i=1,2,……(n-1)時的最值,比較求出最大值就ok

#include using namespace std;

#define max 1010

int main()

for(i=0;ians)

ans = temp;}}

cout<

201312 3 最大的矩形

試題編號 201312 3 試題名稱 最大的矩形 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是h i。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3。請找出...

201312 3 最大的矩形

問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是h i。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3。請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面...

201312 3 最大的矩形

試題編號 201312 3 試題名稱 最大的矩形 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是h i。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3。請找出...