import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
class Solution {
public int[][] matrix;
public int[][] matrixSums;
public Solution(int[][] matrix) {
this.matrix = matrix;
int n = matrix.length;
matrixSums = new int[n][n];
for (int i = 0; i < n; i++) {
matrixSums[i] = Arrays.copyOf(matrix[i], matrix[i].length);
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) {
matrixSums[i][j] += matrixSums[i - 1][j];
}
}
}
static class ArrayMax {
public int startIndex;
public int endIndex;
public int sum;
public ArrayMax(int startIndex, int endIndex, int sum) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.sum = sum;
}
public static ArrayMax getMaxArray(int[] nums) {
int size = nums.length;
int[] dp = new int[size];
int[] pathStart = new int[size];
Arrays.fill(pathStart, -1);
dp[0] = nums[0];
pathStart[0] = 0;
int maxValue = dp[0];
int maxIndex = 0;
for (int i = 1; i < size; i++) {
dp[i] = nums[i];
if (dp[i - 1] > 0) {
dp[i] += dp[i - 1];
pathStart[i] = pathStart[i - 1];
}
if (maxValue < dp[i]) {
maxValue = dp[i];
maxIndex = i;
}
}
return new ArrayMax(pathStart[maxIndex], maxIndex, dp[maxIndex]);
}
}
public ArrayMax countValueOfMatrix(int start, int end) {
int size = matrix.length;
int[] nums = new int[size];
for (int i = 0; i < size; i++) {
nums[i] = matrixSums[end][i];
if (start > 0)
nums[i] -= matrixSums[start - 1][i];
}
return ArrayMax.getMaxArray(nums);
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] matrix = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = scanner.nextInt();
}
}
int[][] dp = new int[n][n];
int maxValue = Integer.MIN_VALUE;
Solution solution = new Solution(matrix);
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
dp[i][j] = solution.countValueOfMatrix(i, j).sum;
maxValue = Math.max(maxValue, dp[i][j]);
}
}
System.out.println(maxValue);
}
}