最大正方形(前缀和)

原题链接

题目描述

在一个 n * m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。

输入描述

输入文件第一行为两个整数 n , m( 1 <= n , m <= 100 ),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1 .

输出描述

一个整数,最大正方形的边长。

输入样例

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

输出样例

2

由于本题为 0、1 矩阵,因此可以考虑用前缀和的方法来做。若某区域内的数字之和恰好等于该区域的面积大小,则说明该区域内的数字皆为 1 ,满足题目要求。因此可以令边长从 1 开始循环直到该矩阵的宽度,当查找到该边长的正方形符合题意时,则更新答案。

参考代码

#include <algorithm>
#include <iostream>
using namespace std;
int a[103][103];
int b[103][103];
int main() {
    
    
  int n, m;
  cin >> n >> m;

  for (int i = 1; i <= n; i++) 
    for (int j = 1; j <= m; j++) {
    
    
      cin >> a[i][j];
      b[i][j] = b[i][j - 1] + b[i - 1][j] - b[i - 1][j - 1] + a[i][j];
    }
  

  int ans = 1;

  int l = 2;
  while (l <= min(n, m)) {
    
    
    for (int i = l; i <= n; i++) 
      for (int j = l; j <= m; j++) 
        if (b[i][j] - b[i - l][j] - b[i][j - l] + b[i - l][j - l] == l * l) 
          ans = max(ans, l);
    l++;
  }

  cout << ans << endl;
  return 0;
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/120016353