201312-3最大的矩形
阿新 • • 發佈:2021-11-13
題目
思路
我們可以這樣求出我們的最大矩形:
對於任意一個矩形h[i]
,我們就以它作為高,求出以它為基準的最大的矩形面積。具體怎麼做呢?
我們可以向左找出比它高的矩形並且是連續的(意思是中間沒有一個比它小的),那這樣子是不是可以形成一個扁長矩形?
同樣的,向右找出比它高的矩形並且是連續,那麼,以h[i]
作為高的最大矩形的面積等於多少不就可以算出來了嗎?那我們依次遍歷這樣的矩形,最大的矩形面積自然也就可以找出來了。
如果不是很能理解的話,看看程式碼應該就能夠懂得了。
程式碼
/* 最大的矩形 */ #include <bits/stdc++.h> using namespace std; int n; int h[1000 + 10], d[1000 + 10]; int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> h[i]; } int maxn = 0; for (int i = 0; i < n; i++) { int j = i, k = 1; // k用於表示以h[i]為高的最大矩形的寬 while (j - 1 >= 0 && h[j - 1] > h[i]) { k++, j--; } j = i; while (j + 1 < n && h[j + 1] > h[i]) { k++, j++; } maxn = max(maxn, h[i] * k); } cout << maxn; return 0; }
後話
剛開始的時候自己比較懶,又或者自己確實比較菜,就是感覺做不出來,然後就是不想動手寫。就去CSDN
上面找了答案,然後發現它們貼的標籤是單調棧
,至於什麼是單調棧,現在我還沒明白(因為沒有去搜),所以這裡先做一下標記,等我想起來了在來補充一下單調棧的東西。