2013-11-11 09:16:22Morris

[ZJ][dp] b123 最大矩形 (Area)


內容 :

輸入說明 :

輸入檔第一行有兩個整數,依序為M 和N, M≦200, N≦200;接下來的M 行中,每一行有N 個0 或1 的數字。這N 個數字彼此間用一個空白隔開。

輸出說明 :

請將最大矩形空地面積寫出至輸出檔。
範例輸入 : 
4 5
0 0 1 1 0
0 1 1 1 1
0 1 1 1 1
0 0 1 0 0

範例輸出 :

8

提示 :

出處 :

95北市資訊學科能力競賽


DJWS http://www.csie.ntnu.edu.tw/~u91029/LargestEmptyRectangle.html#3

在 O(NM) 完成。

#include <stdio.h>
#include <algorithm>
using namespace std;
int n, m, i, j;
int g[205][205];
int main() {
    while(scanf("%d %d", &n, &m) == 2) {
        for(i = 0; i < n; i++) {
            for(j = 0; j < m; j++) {
                scanf("%d", &g[i][j]);
            }
        }
        int wl[205] = {}, wr[205] = {};
        int r[205] = {}, l[205] = {}, h[205] = {};
        int sum;
        int ret = 0;
        for(i = 0; i < n; i++) {
            for(j = 0, sum = 0; j < m; j++) {
                if(g[i][j] == 0)    sum = 0;
                sum = wl[j] = sum + g[i][j];
            }
            for(j = m-1, sum = 0; j >= 0; j--) {
                if(g[i][j] == 0)    sum = 0;
                sum = wr[j] = sum + g[i][j];
            }
            for(j = 0; j < m; j++) {
                if(g[i][j] == 0)    h[j] = 0;
                else                h[j]++;
            }
            for(j = 0; j < m; j++) {
                if(l[j] == 0)        l[j] = wl[j];
                else                l[j] = min(l[j], wl[j]);
                if(r[j] == 0)        r[j] = wr[j];
                else                r[j] = min(r[j], wr[j]);
            }
            for(j = 0; j < m; j++)
                ret = max(ret, (l[j]+r[j]-1)*h[j]);
        }
        printf("%d\n", ret);
    }
    return 0;
}