24h購物| | PChome| 登入
2013-11-11 09:16:22| 人氣2,661| 回應0 | 上一篇 | 下一篇

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

推薦 0 收藏 0 轉貼0 訂閱站台


內容 :

輸入說明 :

輸入檔第一行有兩個整數,依序為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;
}

台長: Morris
人氣(2,661) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 教育學習(進修、留學、學術研究、教育概況) | 個人分類: ZeroJudge |
此分類下一篇:[ZJ] a746 画蛇添足、a799 正值國、a753 一、最大面積
此分類上一篇:[ZJ][單調堆] b123 最大矩形 (Area)

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文