题目描述
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
输入输出格式
输入格式:
输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.
输出格式:
一个整数,最大正方形的边长
输入输出样例
输入样例#1:
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
直接暴力的话可能超时- -
然后一个简单的优化了
优化就是 新建一个数组,记录,这个数字上面有多少个1
然后 寻找这里面的最大正方形
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int d[105][105],dp[105][105],tag[105][105];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(d,0,sizeof(d));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>d[i][j];
if(d[i][j])
{
dp[i][j]=dp[i-1][j]+d[i][j];
tag[i][j]=tag[i][j-1]+d[i][j];
}
}
}/*cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<dp[i][j]<<' ';
}cout<<endl;
}cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<tag[i][j]<<' ';
}cout<<endl;
}
*/
int maxs=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int l=dp[i][j];//这里 注意下
if(dp[i][j])
{
for(int k=1;k<=l;k++)
{
if(dp[i][j+k]<l) l=dp[i][j+k];//这里,最小里面的最大。
if(k>maxs) maxs=k;
}
}
}
}
cout<<maxs<<endl;
}
}