题目:
给一个N*N的01矩阵, 求一个面积最大的全为1的正方形子矩阵. 输出它的面积.
依题意来说,一开始没什么好想法,打算直接暴力枚举,再加上了一些优化。可是后来超时70分,不得不想其他更好的方法了。最后选择了一个判断和累加的方法,方程是total[i,j]:=min(total[i-1,j],total[i,j-1],total[i-1,j-1])+1;
最后用一个max更新最大值即可。
附上代码:
const
maxn=1000;
var
map,total:array[0..maxn,0..maxn] of longint;
n,m,max:longint;
s:ansistring;
procedure init;
var
i,j,num:longint;
begin
readln(n);
for i:=1 to n do
begin
readln(s);
for j:=1 to n do
begin
val(s[j],num);
map[i,j]:=num;
end;
end;
end;
function min(a,b,c:longint):longint;
begin
min:=maxlongint;
if min>a then
min:=a;
if min>b then
min:=b;
if min>c then
min:=c;
end;
procedure main;
var
i,j:longint;
begin
for i:=1 to n do
for j:=1 to n do
if map[i,j]=1 then
begin
total[i,j]:=min(total[i-1,j],total[i,j-1],total[i-1,j-1])+1;
if max<total[i,j] then
max:=total[i,j];
end;
write(max*max);
end;
begin
init;
main;
end.