#include using namespace std; #define MAXN 1050 #define INF 1100000000 int N; int A[MAXN][MAXN]; int dp[MAXN][MAXN][2]; int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); cin.sync_with_stdio(false); cin >> N; int ans = -10000; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> A[i][j]; ans = max(ans, A[i][j]); } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < 2; k++) { dp[i][j][k] = -INF; } } } for (int j = 0; j < N; j++) { dp[0][j][0] = dp[0][j][1] = A[0][j]; } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < 2; k++) { if (A[i][j] > dp[i][j][k]) { dp[i][j][k] = A[i][j]; } } } // spre dreapta for (int j = 0; j < N - 1; j++) { dp[i][j + 1][1] = max(dp[i][j + 1][1], dp[i][j][1] + A[i][j + 1]); } // spre stanga for (int j = N - 1; j >= 0; j--) { dp[i][j - 1][0] = max(dp[i][j - 1][0], dp[i][j][0] + A[i][j - 1]); } // in jos if (i + 1 < N) { for (int k = 0; k < 2; k++) { for (int j = 0; j < N; j++) { for (int nk = 0; nk < 2; nk++) { dp[i + 1][j][nk] = max(dp[i + 1][j][nk], dp[i][j][k] + A[i + 1][j]); } } } } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < 2; k++) { ans = max(ans, dp[i][j][k]); } } } cout << ans << endl; return 0; }