题意:
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
数据范围:n,m<=100
解法:
只介绍dp做法:
令d[i][j]表示以(i,j)为右下角的最大正方形边长
转移方程:
d[i][j]=min(d[i-1][j],d[i][j-1],d[i-1][j-1])+1
直接看转移方程不好理解,看图比较好
如果正方形以(i,j)为右下角
那么正方形的左、上边界一定是(d[i-1][j],d[i][j-1],d[i-1][j-1])三者的最小值
ps:
这题对理解极大化思想有帮助
盗的图:
code:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int d[N][N];
int a[N][N];
int n,m;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1){
d[i][j]=min(min(d[i-1][j],d[i][j-1]),d[i-1][j-1])+1;
ans=max(ans,d[i][j]);
}
}
}
cout<<ans<<endl;
return 0;
}