给定一个 \(N\times N\) 的 \(01\) 矩阵,求边长至少为所有 \(k\) 的全 \(1\) 正方形个数。\(N \leq 250\)
Solution
令 \(f[i][j]\) 表示以 \((i,j)\) 为右下角的最大全 \(1\) 正方形边长,则
- 如果 \(a[i][j]=1\),那么 \(f[i][j]=1+\min(f[i][j-1],f[i-1][j-1,f[i-1][j])\)
- 如果 \(a[i][j]=0\),则 \(f[i][j]=0\)
最后扫一遍 \(f\) 统计答案即可
#include <bits/stdc++.h>
using namespace std;
const int N = 255;
int n,f[N][N],ans[N];
char a[N][N];
signed main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i]+1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(a[i][j]=='1') {
f[i][j]=min(f[i][j-1],min(f[i-1][j-1],f[i-1][j]))+1;
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
for(int k=2;k<=f[i][j];k++) {
ans[k]++;
}
}
}
for(int i=2;i<=n;i++) if(ans[i]) cout<<i<<" "<<ans[i]<<endl;
}