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

相关文章:

  • 2022-12-23
  • 2021-06-16
  • 2021-06-27
  • 2021-12-02
  • 2022-02-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-15
  • 2022-12-23
  • 2021-05-24
  • 2021-10-19
  • 2022-12-23
  • 2021-06-28
  • 2022-12-23
相关资源
相似解决方案