jzoj 2548. 【NOIP2011模拟9.4】最大正方形

发布于 2019-03-27  899 次阅读


题目描述

 给一个N*N的01矩阵, 求一个面积最大的全为1的正方形子矩阵. 输出它的面积.

输入

输入文件square.in的第一行包含一个正整数N.
接下来N行, 每行N个数, 保证不是0就是1. 每行相邻两个数之间没有空格.

输出

输出文件为square.out,仅包含一个整数表示最大的全1子正方形矩阵的面积。

思路

刚开始想直接用字符串进行比较,但会超时,在博客ID:qq_34593871的指点下,学会了一种神奇的方法,就是当前的这个点只可能从左上方的三个点得来,但是因为必须是正方形,所以我们要找到三个里面最小的那个加上一就是当前点的正方形的边长了
~( ̄▽ ̄~)(~ ̄▽ ̄)~

var
  a,f:array[0..1001,0..1001] of longint;
  i,j,k,n,m,s,max:longint;
  st:ansistring;
function min(x,y,z:longint):longint;
var
  m:longint;
begin
  m:=maxlongint;
  if m>x then m:=x;
  if m>y then m:=y;
  if m>z then m:=z;
end;
begin
  readln(n);
  for i:=1 to n do
    begin
      readln(st);
      for j:=1 to n do
        if st[j]='0' then a[i,j]:=0
         else a[i,j]:=1;
    end;
  for i:=1 to n do
    for j:=1 to n 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 max
]]>