8734 {
8735 const int m = matrix.size();
8736 const int n = matrix[0].size();
8737 vector horizontal_next_1s(m, vector(n, 0));
8738 vector vertical_next_1s(m, vector(n, 0));
8739 vector dp(m + 1, vector(n + 1, 0));
8740 for(int i = 0; i < m; i++) {
8741 int cnt = 0;
8742 for(int j = n - 1; j >= 0; j--) {
8743 if(matrix[i][j] == '1') {
8744 cnt++;
8745 } else {
8746 cnt = 0;
8747 }
8748 horizontal_next_1s[i][j] = cnt;
8749 }
8750 }
8751 for(int j = 0; j < n; j++) {
8752 int cnt = 0;
8753 for(int i = m - 1; i >= 0; i--) {
8754 if(matrix[i][j] == '1') {
8755 cnt++;
8756 } else {
8757 cnt = 0;
8758 }
8759 vertical_next_1s[i][j] = cnt;
8760 }
8761 }
8763 for(int i = m - 1; i >= 0; i--) {
8764 for(int j = n - 1; j >= 0; j--) {
8765 if(matrix[i][j] == '1') {
8766 dp[i][j] = min(min(vertical_next_1s[i][j], horizontal_next_1s[i][j]), 1 + dp[i + 1][j + 1]);
8767 ans = max(ans, dp[i][j]);
8768 }
8769 }
8770 }
8772 }
vector< vector< int > > ans