最大子正方形 (!) 动态规划

  

背景描述:忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步。一天,他和女朋友走着走着,不知不觉就来到了一个千里无烟的地方。v神正要往回走,如发现了一块牌子,牌子上有有一行小字和一张图,小字说道:“找到图上最大的交错正方形之后和我联系,这块地就是你的了。”在房价疯长的年代,v神当然不愿错过这个机会,于是开始找了起来……以v神的能力当然找不出来了,你能帮v神找出来吗?
题目描述:
图上有一个矩阵,由N*M个格子组成,这些格子由两种颜色构成,黑色和白色。请找到到面积最大的且内部是黑白交错(即两个相连的正方形颜色不能相同)的正方形。

输入格式:
第一行两个整数N和M,分别表示行数和列数。接下来有N行,每行M个数,0或1分别表示这个格子是黑色或白色。

输出格式:
仅有一行,表示满足条件最大正方形的 边长。

样例输入:
3 3
0 1 0
1 0 0
1 1 1

样例输出:
2

样例解释:
(1,1)到(2,2)这个正方形是满足条件的,它的边长是2


数据范围约定:
对于30%的数据,N <= 20
对于60%的数据,N <=300
对于100%的数据,N <= 1500

var f,a:array[0..1500,0..1500] of longint;
n,m,i,j,k,sum:longint;
function min(x,y,z:longint):longint;
begin
 if x>y then x:=y;
 if x>z then x:=z;
 exit(x);
end;
begin
 assign(input,'p4.in'); assign(output,'p4.out');
 reset(input); rewrite(output);
 readln(n,m);
 for i:=1 to n do
  begin
   for j:=1 to m do
    read(a[i,j]);
   readln;
  end;
 for i:=1 to n do
  for j:=1 to m do
   if (i mod 2)=(j mod 2) then
    a[i,j]:=abs(a[i,j]-1);
 for i:=1 to n do
  for j:=1 to m do
   if a[i,j]=1 then
    begin
    f[i,j]:=min(f[i-1,j],f[i,j-1],f[i-1,j-1])+1;
    if f[i,j]>sum then sum:=f[i,j];
    end;
 fillchar(f,sizeof(f),0);
 for i:=1 to n do
  for j:=1 to m do
   if a[i,j]=0 then
    begin
     f[i,j]:=min(f[i-1,j],f[i,j-1],f[i-1,j-1])+1;
     if f[i,j]>sum then sum:=f[i,j];
    end;
 writeln(sum);
 close(input); close(output);
end.


 


 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页