题目:
给一个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.