#include <algorithm>
#include <climits>
#include <iostream>
using namespace std;

/*
    最大子矩阵:
    1. 单行(i)->转化为最大子序列
    2. 多行(i-j)->将第i行到第j行所有行元素相加得到一维数组,这个一维数组的最大子序列和就是最大子矩阵和
    3. 只需从小到大一次枚举并遍历i和j,接着输出所有子矩阵中的最大值
    4. 可以事先用一个辅助二维数组记录从第一行到第i行的累加值,求i到j行的累加值时只需要做一次减法即可
*/

const int MAXN = 101;
const int MINN = -INT_MAX;
int assist[MAXN][MAXN];
int arr[MAXN][MAXN];
int seq[MAXN];
int dp[MAXN]; // 以第i行结束的矩阵的最大子矩阵的和

//创建辅助矩阵assist,储存以第i行结尾的子矩阵之和的序列
void BuildAssist(int n){
    int tmp[n];
    for(int i=0; i<n; ++i)
        tmp[i] = 0;

    for(int i=0; i<=n; ++i){ //assist第0行全设为0,方便后面相减
        for(int j=0; j<=n; ++j){
            assist[i][j] = tmp[j];
            if(i < n)
                tmp[j] += arr[i][j];
        }
    }
    for(int i=0; i<n; ++i)
        seq[i] = arr[0][i];
}

//计算某一行序列的最大子串和
int MaxSeq(int n){
    dp[0] = seq[0];
    for(int i=1; i<n; ++i){
        dp[i] = max(seq[i], dp[i-1]+seq[i]);
    }
    int res = dp[0];
    for(int i=0; i<n; ++i){
        if(res<dp[i]) res = dp[i];
    }
    return res;
}

int MaxMatrix(int n){
    int res, matrixMax = -INT_MAX;
    //从第一行开始枚举,计算以第i行结尾的最大子矩阵的和
    for(int i=1; i<=n; ++i){
        for(int j=0; j<i; ++j){
            for(int k=0; k<n; ++k){
                seq[k] = assist[i][k]-assist[j][k];
            }
            res = MaxSeq(n);
            if(res>matrixMax) matrixMax = res;
        }
    }

    return matrixMax;
}


int main() {
    int n;
    cin>>n;
    for(int i=0; i<n; ++i)
        for(int j=0; j<n; ++j)
            cin>>arr[i][j];
    BuildAssist(n);
    int res = MaxMatrix(n);
    cout<<res<<endl;
}