/*
TASK: apple
LANG: C++
*/

#include <cstdio>
#include <cstring>

const int MAXN = 72;
const int MAXM = 72;

int N, M;
int dp[MAXN+MAXM][MAXN][MAXN];
int brd[MAXN][MAXM];

int main () {
	scanf ("%d %d", &N, &M);

	int i, j, k;
	for (i = 0; i < N; ++i)
		for (j = 0; j < M; ++j)
			scanf ("%d", brd[i] + j);

	memset (dp, -1, sizeof (dp));
//	dp[N+M-2][N-1][N-1] = brd[N-1][M-1];
	int tmp;
	for (k = N + M - 3; k > 0; --k) {
	    for (i = 0; i <= N; ++i)
			for (j = 0; j <= N; ++j) {
				if (k-j < 0 || k-j >= M
				 || k-i < 0 || k-i >= M
				 || i == j
				 || i == N || j == N) {
//					dp[k][i][j] = -1;//too bad
					continue;
				}
				dp[k][i][j] = brd[i][k-i] + brd[j][k-j];
				tmp = 0;
				tmp >?= dp[k+1][i][j];//they stay at the same x coordinate
				if (i + 1 != j) tmp >?= dp[k+1][i+1][j];
				if (i != j + 1) tmp >?= dp[k+1][i][j+1];
				tmp >?= dp[k+1][i+1][j+1];
//				printf ("%d %d  %d %d  %d %d\n", i, k-i, j, k-j, dp[k][i][j], tmp);
				dp[k][i][j] += tmp;
			}
	}

	printf ("%d\n", brd[0][0] + dp[1][1][0] + brd[N-1][M-1]);

	return 0;
}
