#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:200000000")
using namespace std;
template <typename T>
inline T Abs(T x) {
  return (x >= 0) ? x : -x;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
const int INF = (int)1E9;
const long long INF64 = (long long)1E18;
const long double EPS = 1E-9;
const long double PI = 3.1415926535897932384626433832795;
const int MAXN = 610;
int n, a[MAXN][MAXN], d[MAXN][MAXN], d1[MAXN][MAXN];
void update(int &x, int y) { x = max(x, y); }
bool valid(int x, int y) { return (0 <= x && x < n) && (0 <= y && y < n); }
pair<int, int> f1(int x, int y) { return make_pair(y, x - y); }
int main() {
  cin >> n;
  for (int i = 0; i < (int)(n); i++)
    for (int j = 0; j < (int)(n); j++) cin >> a[i][j];
  memset(d, 225, sizeof d);
  d[0][0] = a[0][0];
  for (int i = 0; i < (int)(2 * n - 2); i++) {
    memset(d1, 225, sizeof d);
    int l = +INF, r = -INF;
    for (int j = 0; j < (int)(n); j++) {
      pair<int, int> cur = f1(i, j);
      if (valid(cur.first, cur.second)) {
        l = min(l, j);
        r = max(r, j);
      }
    }
    for (int j = l; j <= r; j++) {
      pair<int, int> v = f1(i, j);
      for (int k = l; k <= r; k++) {
        pair<int, int> u = f1(i, k);
        for (int cj = 0; cj < (int)(2); cj++)
          for (int ck = 0; ck < (int)(2); ck++) {
            int cur = d[j][k];
            pair<int, int> nv = make_pair(v.first + cj, v.second + 1 - cj);
            pair<int, int> nu = make_pair(u.first + ck, u.second + 1 - ck);
            if (valid(nv.first, nv.second) && valid(nu.first, nu.second)) {
              cur += a[nv.first][nv.second];
              if (nv != nu) cur += a[nu.first][nu.second];
              update(d1[nv.first][nu.first], cur);
            }
          }
      }
    }
    memcpy(d, d1, sizeof d);
  }
  cout << d[n - 1][n - 1] << endl;
  return 0;
}
