#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int INF = 0x3f3f3f3f; const double EPS = 0.000000001; const double PI = 3.141592653589793; const long long LLINF = 99999999999999999LL; const int MAX_N = 10002; int N; int A[MAX_N][MAX_N], D[MAX_N][MAX_N], sumLeft[MAX_N][MAX_N], sumRight[MAX_N][MAX_N]; int bestL[MAX_N], bestR[MAX_N]; int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif cin >> N; for(int i = 1; i <= N; ++i) { for(int j = 1; j <= N; ++j) { cin >> A[i][j]; } } for(int i = 1; i <= N; ++i) { for(int j = 1; j <= N; ++j) { sumLeft[i][j] = sumLeft[i][j - 1] + A[i][j]; } for(int j = N; j >= 1; --j) { sumRight[i][j] = sumRight[i][j + 1] + A[i][j]; } } int minVal = 0; for(int j = 1; j <= N; ++j) { D[N][j] = sumLeft[N][j] - minVal; minVal = min(minVal, sumLeft[N][j]); } minVal = 0; for(int j = N; j >= 1; --j) { D[N][j] = max(D[N][j], sumRight[N][j] - minVal); minVal = min(minVal, sumRight[N][j]); } for(int i = N - 1; i >= 1; --i) { bestL[0] = bestR[N + 1] = -INF; for(int j = 1; j <= N; ++j) { bestL[j] = max(bestL[j - 1], D[i + 1][j] + sumRight[i][j]); } for(int j = N; j >= 1; --j) { bestR[j] = max(bestR[j + 1], D[i + 1][j] + sumLeft[i][j]); } for(int j = 1; j <= N; ++j) { D[i][j] = max(A[i][j], A[i][j] + D[i + 1][j]); D[i][j] = max(D[i][j], A[i][j] + bestL[j - 1] - sumRight[i][j]); D[i][j] = max(D[i][j], A[i][j] + bestR[j + 1] - sumLeft[i][j]); } } int ans = A[1][1]; for(int i = 1; i <= N; ++i) { for(int j = 1; j <= N; ++j) { ans = max(ans, D[i][j]); } } printf("%d\n", ans); return 0; }