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