문제

링크

풀이

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
 
void solve(void) {
  int r, c; cin >> r >> c;
  vector<vector<bool>> v(r, vector<bool>(c));
  for (int i=0; i<r; i++) {
    string s; cin >> s;
    for (int j=0; j<c; j++) v[i][j] = s[j] == '1';
  }
 
  vector<vector<int>> dp1(r, vector<int>(c, 0)), dp2(r, vector<int>(c, 0));
  for (int i=r-1; i>=0; i--) {
    for (int j=c-1; j>=0; j--) {
      if (!v[i][j]) continue;
      dp1[i][j]++; dp2[i][j]++;
      if (i > 0 && j < c-1 && v[i-1][j+1]) dp1[i-1][j+1] += dp1[i][j];
      if (i > 0 && j > 0 && v[i-1][j-1]) dp2[i-1][j-1] += dp2[i][j];
    }
  }
 
  int ans = 0;
  for (int i=0; i<r; i++) {
    for (int j=0; j<c; j++) {
      if (!v[i][j]) continue;
      int m = min(dp1[i][j], dp2[i][j]);
      for (int k=ans+1; k<=m; k++) {
        if (dp1[i+k-1][j+k-1] < k || dp2[i+k-1][j-k+1] < k) continue;
        ans = max(ans, k);
      }
    }
  }
  cout << ans;
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}