JZOJ8.13最大正方形

本文介绍了一种高效算法来解决寻找N*N矩阵中全为1的最大正方形子矩阵的问题,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值