int dp[5][maxn][maxn]; int n, m, ans, a[maxn][maxn];
inlineintmax_(int a, int b) { return a > b ? a : b; }
inlineintRead() { intx(0), f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar(); return x * f; }
intmain() { n = Read(), m = Read(); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) a[i][j] = Read(); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) dp[1][i][j] = max_(dp[1][i - 1][j], dp[1][i][j - 1]) + a[i][j];
for (int i = 1; i <= n; ++i) for (int j = m; j >= 1; --j) dp[2][i][j] = max_(dp[2][i - 1][j], dp[2][i][j + 1]) + a[i][j];
for (int i = n; i >= 1; --i) for (int j = m; j >= 1; --j) dp[3][i][j] = max_(dp[3][i + 1][j], dp[3][i][j + 1]) + a[i][j];
for (int i = n; i >= 1; --i) for (int j = 1; j <= m; ++j) dp[4][i][j] = max_(dp[4][i + 1][j], dp[4][i][j - 1]) + a[i][j];
for (int i = 2; i < n; ++i) for (int j = 2; j < m; ++j) ans = max_ (ans, dp[1][i - 1][j] + dp[3][i + 1][j] + dp[2][i][j + 1] + dp[4][i][j - 1]), ans = max_ (ans, dp[1][i][j - 1] + dp[3][i][j + 1] + dp[2][i - 1][j] + dp[4][i + 1][j]); printf ("%d\n", ans); system("pause"); }