#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")