1. 程式人生 > 其它 >201312-3最大的矩形

201312-3最大的矩形

題目

題目連結

思路

我們可以這樣求出我們的最大矩形:
對於任意一個矩形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上面找了答案,然後發現它們貼的標籤是單調棧,至於什麼是單調棧,現在我還沒明白(因為沒有去搜),所以這裡先做一下標記,等我想起來了在來補充一下單調棧的東西。