数据预处理,空间换时间
O(n^3)
O()
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) */