41 边界都是1的最大正方形大小
Table of Contents

ac

数据预处理,空间换时间

import java.util.Scanner;


public class Main {

    public static Scanner sc = new Scanner(System.in);

    /**
     * 时间复杂度为O(n^3)
     * 空间复杂度为O(n^2
     *
     * @param args
     */
    public static void main(String[] args) {
        int n = sc.nextInt();
        int[][] arr = new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        // 额外空间
        // 横向sum
        int[][] lSum = new int[n][n+1];
        for(int i=0;i<n;i++){
            lSum[i][0] = 0;
            for(int j = 1; j <= n; j++){
                lSum[i][j]= lSum[i][j-1] + arr[i][j-1];
            }
        }
        // 纵向sum
        int[][] vSum = new int[n+1][n];
        for(int i=0;i<n;i++){ // 每一列
            vSum[0][i] = 0;
            for(int j = 1; j <= n; j++){
                vSum[j][i]= vSum[j-1][i] + arr[j-1][i];
            }
        }
        // [i,j] = vSum[j+1] - vSum[i];
        int ans = 0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                int val = arr[i][j];
                if(val == 0){
                    continue;
                }
                // 边长 k
                for(int k = 2; k<= n;k++){
                    // O(1) 判断 边 合理,总量也合理 即是了
                    int ei = i + k - 1;
                    int ej = j + k - 1;
                    if(ei < n && ej < n){
                        int a = (vSum[ei+1][j] - vSum[i][j]);
                        int b =  (vSum[ei+1][ej] - vSum[i][ej]);
                        int c =  (lSum[i][ej+1] - lSum[i][j]);
                        int d = (lSum[ei][ej+1] - lSum[ei][j]);
                        if(a == k && b == k && c == k && d == k){
//                            System.out.println(i + " " + j + " " + k);
                            if(k > ans){
                                ans = k;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(ans);
    }

}
/*
5
0 1 1 1 1
0 1 0 0 1
0 1 0 0 1
0 1 1 1 1
0 1 0 1 1


(i j)(i ej)

 (ei j) (ei, ej)
*/