24h購物| | PChome| 登入
2011-08-04 17:49:57| 人氣1,248| 回應1 | 上一篇 | 下一篇

b018. F. 營地

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

b018. F. 營地

內容 :

露營時都搭過帳棚吧?但帳棚也不是說搭就搭,必須要有一塊平坦的空地才行,否則就必須要先整理場地,清除石塊、雜物才能搭好。但也不是說清理就清理,有時候如果出現很大塊的石頭或是大型的坑洞,帳篷就不得不避開這樣的地方。

清理好場地以後,要搭怎麼樣的帳棚呢?雖然大部分是依場地而定,但對於初學者可能還是以特定的形狀為宜。

        現在給你一塊空地的資料,請你計算出在這營地上能夠搭建帳篷的最大面積。為了簡化問題,假設營地為一  L * W 的矩形,並分為 L * W 個方格,方格為場地的最小單位,一個方格內的場地特性視為一體。並限制所搭帳篷的形狀必須是正方形,且帳篷的四邊和營地的四邊分別對應平行。

輸入說明 :

輸入含有多筆測試資料,每筆資料第一行有兩個數字 L, W(1 ≦ L, W ≦ 5000),代表場地的長和寬。接下來 L 行每行有 W 個介於0~2之間的整數,代表每一塊方格的資料,0代表此格可以直接使用,1表示必須經過整理,2表示有無法清理的障礙物。第一行為兩個零時表示檔案結 束,不須處理這組輸入。

輸出說明 :

每筆資料輸出一行,含有一個正整數,代表最大帳篷的面積。

範例輸入 :

4 5
1 0 0 2 0
0 1 1 0 0
0 2 1 1 1
1 0 0 1 2
0 0

範例輸出 :

4

提示 :

* 注意:這個題目若直接宣告 5000 * 5000 的陣列會出 Runtime Error。請用較少的陣列解決這個問題。

出處 :

2006 NPSC 高中組初賽


作法 : DP
紀錄某一格能做的最大正方形, 抓左上, 上方, 左方, 的最小值+1 成為新的正方形


/**********************************************************************************/
/*  Problem: b018 "F. 營地" from 2006 NPSC 高中組初賽                      */
/*  Language: C                                                                   */
/*  Result: AC (156ms, 288KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-08-04 15:42:18                                     */
/**********************************************************************************/


#include<stdio.h>
char s[20000];
main() {
    int n, m, a, b, c;
    while(scanf("%d %d", &n, &m) == 2) {
        if(n == 0 && m == 0) break;
        int DP1[5001] = {}, DP2[5001] = {};
        int *A = DP1, *B = DP2, *C, Ans = 0;
        getchar();
        int L = 2*m-1;
        for(a = 0; a < n; a++) {
            gets(s);
            for(b = 0, c = 1; b < L; b += 2, c++) {
                if(s[b] != '2') {
                    B[c] = A[c];
                    B[c] = B[c] < A[c-1] ? B[c] : A[c-1];
                    B[c] = B[c] < B[c-1] ? B[c] : B[c-1];
                    B[c]++;
                    Ans = Ans > B[c] ? Ans : B[c];
                }
                else {B[c] = 0;}
            }
            C = A, A = B, B= C;
        }
        printf("%d\n", Ans*Ans);
    }
    return 0;
}

台長: Morris
人氣(1,248) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: NPSC |
此分類下一篇:b099. E. 聯立多元一次方程式 (優化重製)
此分類上一篇:b094. H. 數字拼盤 (IDA* 版本)

Lee
IO加速又一招
2011-08-04 19:18:08
版主回應
Good
2011-08-04 20:14:06
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文