import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[][] matrix = new int[n][n]; for (int i = 0; i < matrix[0].length; i++) { for (int j = 0; j < matrix.length; j++) { matrix[i][j] = in.nextInt(); } } System.out.println(finMaxSubMatrix(matrix)); } public static int finMaxSubMatrix(int[][] matrix) { int res = Integer.MIN_VALUE; int[][] dp = new int[matrix.length][matrix[0].length]; dp[0][0] = matrix[0][0]; for (int i = 1; i < matrix[0].length; i++) dp[0][i] = dp[0][i - 1] + matrix[0][i]; for (int j = 1; j < matrix.length; j++) dp[j][0] = dp[j - 1][0] + matrix[j][0]; for (int i = 1; i < matrix[0].length; i++) { for (int j = 1; j < matrix.length; j++) { dp[i][j] = matrix[i][j] + dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]; } } //遍历,对于每一个右下角,枚举其左上角 int curMatrix = 0; for (int i = 0; i < matrix[0].length; i++) { for (int j = 0; j < matrix.length; j++) { //右下角i,j for (int u = 0; u <= i; u++) { for (int v = 0; v <= j; v++) { //左上角u,v int a = dp[i][j]; int b = safeGet(dp, u - 1, v - 1); int c = safeGet(dp, u - 1, j); int d = safeGet(dp, i, v - 1); curMatrix = a + b - c - d; res = Math.max(curMatrix, res); } } } } return res; } private static int safeGet(int[][]matrix, int i, int j) { int res = 0; try { res = matrix[i][j]; } catch (Exception e) {} return res; } }