問題描述
在橫軸上放了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。請找出...