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.