【USACO题库】5.3.4 Big Barn巨大的牛棚

题目描述


农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方。我们假定,他的农场划分成 N x N 的方格。输入数据中包括有树的方格的列表。你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚。牛棚的边必须和水平轴或者垂直轴平行。


EXAMPLE

考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,‘#'表示有树的方格


最大的牛棚是 5 x 5 的,可以建造在方格右下角的两个位置其中一个。

INPUT FORMAT
Line 1: 两个整数: N (1 <= N <= 1000),农场的大小,和 T (1 <= T <= 10,000)有树的方格的数量
Lines 2..T+1: 两个整数(1 <= 整数 <= N), 有树格子的横纵坐标

SAMPLE INPUT (file bigbrn.in)

8 3

2 2

2 6
6 3


OUTPUT FORMAT

输出文件只由一行组成,约翰的牛棚的最大边长。

SAMPLE OUTPUT (file bigbrn.out)

5


这道题其实很简单,就是一个DP,判断当前点的左上方,右上方,中上方,三个矩形所比较出的最小值,取这个值+1就等于当前的值了,至于为什么,在草稿纸上模拟一下即可。

var
        n,t,x,y,max,i,j:Longint;
        a:array[1..1000,1..1000] of boolean;
        f:array[0..1000,0..1000] of Longint;

function min(x,y:Longint):Longint;
begin
        if x<y then exit(x); exit(y);
end;

begin
        readln(n,t);
        fillchar(a,sizeof(a),true);
        for i:=1 to t do
        begin
                readln(x,y);
                a[x,y]:=false;
        end;

        for i:=1 to n do
                for j:=1 to n do
                        if a[i,j] then
                        begin
                                f[i,j]:=min(min(f[i,j-1],f[i-1,j]),f[i-1,j-1])+1;
                                if f[i,j]>max then max:=f[i,j];
                        end;

        writeln(max);
end.

你可能感兴趣的:(【USACO题库】5.3.4 Big Barn巨大的牛棚)