您的位置:首页 > 其它

矩阵动归--最大正方形

2017-08-10 14:33 218 查看


题目描述

在一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: