中山培训 2016.7.11

来源:互联网 发布:ubuntu 麒麟wineqq 编辑:程序博客网 时间:2024/04/27 19:07

Description

你家刚买了一套新房,想邀请朋友回来庆祝,所以需要一个很大的举行餐桌,餐桌能容纳的人数等于餐桌的周长,你想买一个能容纳最多人的餐桌,餐桌的边必须跟房间的边平行。
给你的房间的设计,计算最多能邀请的客人数。

Input

第一行包含两个整数R和C(1<=R,C<=2000),表示房子的长和宽。
接下来R行每行S个字符(中间没有空格),“.”表示空白区域,“X”表示有障碍物,餐桌所占区域必须是空白的。

Output

输出最多能要求的客人数量。

Sample Input

输入1:

2 2

..

..



输入2:

4 4

X.XX

X..X

..X.

..XX



输入3:

3 3

X.X

.X.

X.X

Sample Output

输出1:

7



输出2:

9



输出3:

3

 

 

直接暴力,一开始我枚举所有矩形,只得了20分,结果朱原销神奇的用一个方法就AC了,我们算了算复杂度高达O(N^3),n<=2000,居然过了。方法很简单,预处理一下,就开心得暴力了。

 

var

 a:array[1..2000,1..2000] of longint;

 f:array[1..2000] of longint;

 ans,n,m,t:longint;

 ch:char;

 

procedure init;

var i,j,k:longint;

begin

 readln(n,m);

 fori:=1 to n do

 begin

  forj:=1 to m do

   begin

    read(ch);

    ifch='X' then a[i,j]:=-1;

   end;

 readln;

 end;

 fori:=1 to m do

  ifa[m,i]<>-1 then

  a[m,i]:=1;

 

 fori:=n-1 downto 1 do

  fork:=1 to m do

   begin

    ifa[i,k]<>-1 then

     ifa[i+1,k]=-1 then a[i,k]:=1

                    else a[i,k]:=a[i+1,k]+1;

   end;

end;

 

function max(x,y:longint):longint;

 begin

  ifx>y then exit(x)

        else exit(y);

 end;

 

procedure main;

 vari,j,k,min,x:longint;

begin

for i:=1 to n do

    forj:=1 to m do

     if a[i,j]>0 then

       begin

         x:=j; min:=maxlongint;

          while a[i,x]>0 do

           begin

              if a[i,x]<min thenmin:=a[i,x];

              if (x-j+1+min)*2-1>ans thenans:=(x-j+1+min)*2-1;

              inc(x);

           end;

       end;

     writeln(ans);

end;

 

begin

 init;

 main;

end.

 

0 0
原创粉丝点击