给定一个 (N imes 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;
}