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) 完成。
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;
}