洛谷 P1387 最大正方形

本文介绍了一个寻找矩阵中不含0的最大正方形的算法实现,通过记录连续1的数量并模拟正方形扩展来确定最大边长。

题目概述

    在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

    1<=n,m<=100

解题思路

    在读入的时候,如果读入了1,记下每行中到这个1之前有多少个连续的1。

    我采用的是模拟正方形的右下角,向上扩展,记下合法边长的最大值。

    合法边长为向上扩展的过程中扩展次数和扩展路径上记录值的最小值之间较小的数。

    注意边界,差值可能为负数。

    时间复杂度:O(n*m^2)

    空间复杂度:O(n*m)

源程序

var
 a,b:array[0..102,0..102]of longint;
 i,j,n,m,ans,now,x:longint;
function max(a,b:longint):longint;
 begin
  if a>b then exit(a)
         else exit(b);
 end;
function min(a,b:longint):longint;
 begin
  if a<b then exit(a)
         else exit(b);
 end;
begin
 readln(n,m);
 for i:=1 to n do
  begin
   for j:=1 to m do
    begin
     read(a[i,j]);
     if a[i,j]=1 then b[i,j]:=b[i,j-1]+1;
    end;
   readln;
  end;
 ans:=0;
 for i:=1 to n do
  for j:=1 to m do
   begin
    if a[i,j]=0 then continue;
    now:=b[i,j];
    x:=i;
    while x>=1 do
     begin
      if now>b[x,j] then now:=b[x,j];
      ans:=max(ans,min(now,i-x+1));
      dec(x);
     end;
   end;
 write(ans);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值