/*
TASK: apple
LANG: C
*/

#include <stdio.h>

#define MAX 75

void input(void);
void solve(void);

int DP(int time, int r1, int c1, int r2, int c2);

const int dx[] = { 0, 1 };
const int dy[] = { 1, 0 };

int n, m;
int G[MAX][MAX];
int F[2 * MAX][MAX][MAX]; /* DP array */

int main(void)
{
    input(); 
    solve();
    
    return 0;
}

void input(void)
{
     int i, j;
     
     scanf("%d %d", &n, &m);
     
     for(i = 1; i <= n; i++)
       for(j = 1; j <= m; j++) scanf("%d", &G[i][j]);
}

void solve(void)
{
     int i, j, k;
     
     for(k = 0; k < 2 * MAX; k++)
       for(i = 0; i < MAX; i++)
         for(j = 0; j < MAX; j++) F[k][i][j] = -1;
         
     printf("%d\n", DP(1, 1, 1, 1, 1));
}

int DP(int time, int r1, int c1, int r2, int c2)
{
    int best, z;
    int a, b, x, y;
    int i, j;
    
    if(time == n + m - 1)     return G[n][m];
    if(F[time][r1][r2] != -1) return F[time][r1][r2];
    
    best = 0;
    
    for(i = 0; i < 2; i++) {
      a = r1 + dx[i]; 
      b = c1 + dy[i];
      if(a < 1 || a > n || b < 1 || b > m) continue;
      for(j = 0; j < 2; j++) {
        x = r2 + dx[j];
        y = c2 + dy[j];
        if(x < 1 || x > n || y < 1 || y > m) continue;
        z = DP(time + 1, a, b, x, y);
        best = best < z ? z : best;
      }
    }
    
    if(r1 == r2 && c1 == c2) best += G[r1][c1];
    else best += G[r1][c1] + G[r2][c2];
    
    return F[time][r1][r2] = best;
}
            



