矩阵动归--最大正方形

来源:互联网 发布:飞越巅峰 知乎 编辑:程序博客网 时间:2024/05/14 16:04

题目描述

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

输入输出格式

输入格式:

输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.

输出格式:

一个整数,最大正方形的边长

题解:f[i][j]表示从(1,1)到(i,j)的矩形和,再用二分查找

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int n,m,num=0;
int f[151][151],l,r,mid;
int ok(int x)
{
for(int i=x;i<=n;i++)
for(int j=x;j<=m;j++)
{num=f[i][j]-f[i-x][j]-f[i][j-x]+f[i-x][j-x];
if(num>=x*x) return 1;//一定是num>=x*x 否则会wa
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{   cin>>f[i][j];
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+f[i][j];
}
l=0;r=min(n,m);
while(l<r)
{mid=(l+r+1)>>1;
if(ok(mid)) l=mid;
else r=mid-1;
}
cout<<l<<endl;
 } 

输出样例#1:
2