| | | | 背景 Background | | | 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步。一天,他和女朋友走着走着,不知不觉就来到了一个千里无烟的地方。v神正要往回走,如发现了一块牌子,牌子上有有一行小字和一张图,小字说道:“找到图上最大的交错正方形之后和我联系,这块地就是你的了。”在房价疯长的年代,v神当然不愿错过这个机会,于是开始找了起来……以v神的能力当然找不出来了,你能帮v神找出来吗? | | | |
| | | | 描述 Description | | | 图上有一个矩阵,由N*M个格子组成,这些格子由两种颜色构成,黑色和白色。请找到到面积最大的且内部是黑白交错(即两个相连的正方形颜色不能相同)的正方形。 | | | |
| | | | 输入格式 Input Format | | | 第一行两个整数N和M,分别表示行数和列数。接下来有N行,每行M个数,0或1分别表示这个格子是黑色或白色。 | | | |
| | | | 输出格式 Output Format | | | 仅有一行,表示满足条件最大正方形的 边长。 | | | |
| | | | 样例输出 Sample Output [复制数据] | | | | | | |
| | | | 时间限制 Time Limitation | | | 各个测试点1s | | | |
| | | | 注释 Hint | | | 样例解释: (1,1)到(2,2)这个正方形是满足条件的,它的边长是2 数据范围约定: 对于30%的数据,N <= 20 对于60%的数据,N <=300 对于100%的数据,N <= 1500 | | | |
|
====================================
维护left[i,j],up[i,j]
==========================
var
n,m:longint;
f,left,up:array[0..1500,0..1500]of longint;
map:array[0..1500,0..1500]of longint;
procedure init;
begin
assign(input,'ty1563.in');
assign(output,'ty1563.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure main;
var
i,j:longint;
ans:longint;
begin
readln(n,m);
fillchar(f,sizeof(f),0);
fillchar(map,sizeof(map),$ff);
fillchar(left,sizeof(left),0);
fillchar(up,sizeof(up),0);
// for i:=1 to n do
// for j:=1 to m do
// f[i,j]:=1;
for i:=1 to n do
for j:=1 to m do
begin
read(map[i,j]);
if map[i,j]<>map[i-1,j] then
begin up[i,j]:=up[i-1,j]+1 end
else up[i,j]:=1;
if map[i,j]<>map[i,j-1] then
begin left[i,j]:=left[i,j-1]+1 end
else left[i,j]:=1;
end;
ans:=1;
for i:=1 to n do
for j:=1 to m do
begin
f[i,j]:=1;
if f[i-1,j-1]+1>f[i,j] then f[i,j]:=f[i-1,j-1]+1;
if left[i,j]<f[i,j] then f[i,j]:=left[i,j];
if up[i,j]<f[i,j] then f[i,j]:=up[i,j];
if f[i,j]>ans then ans:=f[i,j];
end;
writeln(ans);
end;
begin
init;
main;
terminate;
end.