#include <climits>
#include <iostream>
using namespace std;
//最大值初始化位最小值
int dp[100][100];
int temp[100][100];
int N;
//ij是起始坐标
void func(int i,int j,int &maxv)
{
    temp[i][j]=dp[i][j];
    //纵向--起始坐标那一竖
    for(int x=i+1;x<N;x++)
    {
        temp[x][j]=temp[x-1][j]+dp[x][j];
        if(temp[x][j]>maxv) maxv=temp[x][j];
    }
    //横向--起始坐标那一横
    for(int y=j+1;y<N;y++)
    {
        temp[i][y]=temp[i][y-1]+dp[i][y];
        if(temp[i][y]>maxv) maxv=temp[i][y];
    }
    //计算以ij为起始的各个二维前缀和
    for(int x=i+1;x<N;x++)
    {
        for(int y=j+1;y<N;y++)
        {
            temp[x][y]=temp[x-1][y]+temp[x][y-1]-temp[x-1][y-1]+dp[x][y];
            if(temp[x][y]>maxv) maxv=temp[x][y];
        }
    }
}
int main()
{
    while(cin>>N)
    {
        //处理输入
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                cin>>dp[i][j];
            }
        }
        //挨个作为矩阵前缀和的起始坐标
        int maxv=dp[0][0];//假设坐标00,大小1X1的矩阵就是目标
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                //看看起始坐标大小
                maxv=max(maxv,dp[i][j]);
                func(i,j,maxv);
            }
        }
        cout<<maxv<<endl;
    }
}
// 64 位输出请用 printf("%lld")