【題解】TIOJ 1063 . 最大矩形(Area)

【姐妹題】ZeroJudge b123: 最大矩形 (Area)
【題目敘述】https://tioj.ck.tp.edu.tw/problems/1063
【解題想法】

  • len[j]:紀錄col-j看到的,從前面的rows累積過來的「連續長度」(圖例中的 length 方向)。
  • 循序檢查每一列(row),更新len[j]。
    • len[j] = a[i][j] ? len[j] + 1 : 0;
  • 檢查每一列時,從每一個col-j 由後往前檢查,直到遇到 len[k] < len[j]。
    • 0 <= k < j
    • 新增面積值 len[j] * (j-k)。
    • 更新目前為止的最大面積 mx。
#include <iostream>
#include <cstring>
using namespace std;
int a[205][205];
int len[205];
 
int main(){
    int M, N;
    while (cin >> M >> N){
        memset(a, 0, sizeof(0));
        memset(len, 0, sizeof(len));
        for (int i=0; i<M; i++){
            for (int j=0; j<N; j++){
                cin >> a[i][j];
            }
        }
        int mx = 0;
        for (int i=0; i<M; i++){
            for (int j=0; j<N; j++){
                len[j] = a[i][j] ? len[j] + 1 : 0;
                int mn = len[j];
                int k = j - 1;
                mx = max(mx, mn);
                while (k >= 0 && a[i][k] == 1){
                    mn = min(mn, len[k]);
                    k--;
                    mx = max(mx, mn * (j-k));
                }
            }
        }
        cout << mx << '\n';
    }
    return 0;
}
分享本文 Share with friends