#include #define in cin #define out cout #define abs(x) ((x>0)?(x):(-(x))) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define DOWNFOR(i, a, b) for(int i = a; i >= b; --i) #define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i) using namespace std; typedef long long ll; const int Nmax = 1001; int N,a[Nmax][Nmax]; int l[2][Nmax],r[2][Nmax]; int s[Nmax]; int ss(int a,int b,int A[],int B[]){ return B[b]+s[max(a,b)]-s[min(a,b)-1]; } void it(int st,int dr,int a,int b,int A[],int B[],int t){ int ans=0; if(st>=dr){ for(int j=a;j<=b;j++){ if(t==0 && j>=st) if( ss(st,j,A,B) > ans ) ans=ss(st,j,A,B); if(t==1 && j<=st) if( ss(st,j,A,B) > ans ) ans=ss(st,j,A,B); } A[st]=ans; return; } int mij=(st+dr)/2,ch=0; for(int j=a;j<=b;j++){ if(t==0 && j>=mij) if( ss(mij,j,A,B) > ans ) ans=ss(mij,j,A,B),ch=j; if(t==1 && j<=mij) if( ss(mij,j,A,B) > ans ) ans=ss(mij,j,A,B),ch=j; } A[mij]=ans; it(st,mij,a,ch,A,B,t); it(mij+1,dr,ch,b,A,B,t); } void calc(int A[],int B[],int V[],int t){ for(int i=1;i<=N;i++) s[i]=s[i-1]+V[i]; it(1,N,1,N,A,B,t); } int main(){ #ifndef ONLINE_JUDGE ifstream in("test.in"); ofstream out("test.out"); #endif in>>N; int ans=0; for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ in>>a[i][j]; ans=max(ans,a[i][j]); } } int p=0; for(int i=1;i<=N;i++){ p=!p; calc(l[p],r[!p],a[i],0); calc(r[p],l[!p],a[i],1); for(int j=1;j<=N;j++){ if(l[p][j]<0) l[p][j]=0; if(r[p][j]<0) r[p][j]=0; } for(int j=1;j<=N;j++){ l[p][j]=max(l[p][j],l[!p][j]+a[i][j]); r[p][j]=max(r[p][j],r[!p][j]+a[i][j]); } //for(int j=1;j<=N;j++) out<