#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
bool maximize(T& a, const T& b) {
if (b < a) return false;
a = b;
return true;
}
const int N = 2e2 + 5;
const int M = 2e2 + 5;
int dx[2] = {1, 0};
int dy[2] = {0, 1};
int n, m;
int a[N][M];
int what_subtask() {
if (n <= 50 && m <= 50) return 2;
return 3;
}
bool inside(int x, int y) {
return (1 <= x && x <= n && 1 <= y && y <= m);
}
bool corner(int x, int y) {
return ((x == 1 && y == 1) || (x == n && y == m));
}
namespace sub2 {
const int N = 55, M = 55;
// dp[x1][y1][x2][y2] là tổng số điểm kinh nghiệm lớn nhất đạt được khi An đã đến ô (x1, y1) và Bình đã đến ô (x2, y2)
bool vis[N][M][N][M];
int memo[N][M][N][M];
int dp(int x1, int y1, int x2, int y2) {
if (!inside(x1, y1) || !inside(x2, y2)) return -INF;
if (x1 == 1 && y1 == 1 && x2 == 1 && y2 == 1) return 0;
if (!corner(x1, y1) && !corner(x2, y2) && x1 == x2 && y1 == y2) return -INF;
int& ans = memo[x1][y1][x2][y2];
if (vis[x1][y1][x2][y2]) return ans;
vis[x1][y1][x2][y2] = true;
ans = -INF;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
int prev_x1 = x1 - dx[i], prev_y1 = y1 - dy[i];
int prev_x2 = x2 - dx[j], prev_y2 = y2 - dy[j];
maximize(ans, dp(prev_x1, prev_y1, prev_x2, prev_y2) + a[x1][y1] + a[x2][y2]);
}
}
return ans;
}
void solve() {
memset(vis, 0, sizeof vis);
cout << dp(n, m, n, m) << '\n';
}
}
namespace sub3 {
// dp[x1][y1][x2][y2] là tổng số điểm kinh nghiệm lớn nhất đạt được khi An đã đến ô (x1, y1) và Bình đã đến ô (x2, y2)
// Ta có:
// x1 + y1 = x2 + y2
// <=> y2 = x1 + y1 - x2
// => y2 phụ thuộc vào 3 tham số còn lại
// => chỉ cần lưu thông tin x1, y1, x2
bool vis[N][M][N];
int memo[N][M][N];
int dp(int x1, int y1, int x2) {
int y2 = x1 + y1 - x2;
if (!inside(x1, y1) || !inside(x2, y2)) return -INF;
if (x1 == 1 && y1 == 1 && x2 == 1 && y2 == 1) return 0;
if (!corner(x1, y1) && !corner(x2, y2) && x1 == x2 && y1 == y2) return -INF;
int& ans = memo[x1][y1][x2];
if (vis[x1][y1][x2]) return ans;
vis[x1][y1][x2] = true;
ans = -INF;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
int prev_x1 = x1 - dx[i], prev_y1 = y1 - dy[i];
int prev_x2 = x2 - dx[j];
maximize(ans, dp(prev_x1, prev_y1, prev_x2) + a[x1][y1] + a[x2][y2]);
}
}
return ans;
}
void solve() {
memset(vis, 0, sizeof vis);
cout << dp(n, m, n) << '\n';
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) cin >> a[i][j];
}
int subtask = what_subtask();
if (subtask == 2) sub2::solve();
if (subtask == 3) sub3::solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpib29sIG1heGltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChiIDwgYSkgcmV0dXJuIGZhbHNlOyAKCWEgPSBiOyAKCXJldHVybiB0cnVlOyAKfQoKY29uc3QgaW50IE4gPSAyZTIgKyA1OyAKY29uc3QgaW50IE0gPSAyZTIgKyA1OyAgCgppbnQgZHhbMl0gPSB7MSwgMH07IAppbnQgZHlbMl0gPSB7MCwgMX07IAoKaW50IG4sIG07ICAKaW50IGFbTl1bTV07ICAKCmludCB3aGF0X3N1YnRhc2soKSB7CglpZiAobiA8PSA1MCAmJiBtIDw9IDUwKSByZXR1cm4gMjsgIAoJcmV0dXJuIDM7ICAKfQoKYm9vbCBpbnNpZGUoaW50IHgsIGludCB5KSB7CglyZXR1cm4gKDEgPD0geCAmJiB4IDw9IG4gJiYgMSA8PSB5ICYmIHkgPD0gbSk7IAp9Cgpib29sIGNvcm5lcihpbnQgeCwgaW50IHkpIHsKCXJldHVybiAoKHggPT0gMSAmJiB5ID09IDEpIHx8ICh4ID09IG4gJiYgeSA9PSBtKSk7ICAgCn0KCm5hbWVzcGFjZSBzdWIyIHsKCWNvbnN0IGludCBOID0gNTUsIE0gPSA1NTsgICAKCgkvLyBkcFt4MV1beTFdW3gyXVt5Ml0gbMOgIHThu5VuZyBz4buRIMSRaeG7g20ga2luaCBuZ2hp4buHbSBs4bubbiBuaOG6pXQgxJHhuqF0IMSRxrDhu6NjIGtoaSBBbiDEkcOjIMSR4bq/biDDtCAoeDEsIHkxKSB2w6AgQsOsbmggxJHDoyDEkeG6v24gw7QgKHgyLCB5MikgCglib29sIHZpc1tOXVtNXVtOXVtNXTsgIAoJaW50IG1lbW9bTl1bTV1bTl1bTV07ICAgCgoJaW50IGRwKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewoJCWlmICghaW5zaWRlKHgxLCB5MSkgfHwgIWluc2lkZSh4MiwgeTIpKSByZXR1cm4gLUlORjsgIAoJCWlmICh4MSA9PSAxICYmIHkxID09IDEgJiYgeDIgPT0gMSAmJiB5MiA9PSAxKSByZXR1cm4gMDsgICAKCQlpZiAoIWNvcm5lcih4MSwgeTEpICYmICFjb3JuZXIoeDIsIHkyKSAmJiB4MSA9PSB4MiAmJiB5MSA9PSB5MikgcmV0dXJuIC1JTkY7ICAgCgoJCWludCYgYW5zID0gbWVtb1t4MV1beTFdW3gyXVt5Ml07ICAKCQlpZiAodmlzW3gxXVt5MV1beDJdW3kyXSkgcmV0dXJuIGFuczsgICAKCgkJdmlzW3gxXVt5MV1beDJdW3kyXSA9IHRydWU7ICAgCgoJCWFucyA9IC1JTkY7ICAgCgkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKCQkJCWludCBwcmV2X3gxID0geDEgLSBkeFtpXSwgcHJldl95MSA9IHkxIC0gZHlbaV07ICAgCgkJCQlpbnQgcHJldl94MiA9IHgyIC0gZHhbal0sIHByZXZfeTIgPSB5MiAtIGR5W2pdOyAgICAKCQkJCW1heGltaXplKGFucywgZHAocHJldl94MSwgcHJldl95MSwgcHJldl94MiwgcHJldl95MikgKyBhW3gxXVt5MV0gKyBhW3gyXVt5Ml0pOyAKCQkJfQoJCX0KCgkJcmV0dXJuIGFuczsgIAoJfQoKCXZvaWQgc29sdmUoKSB7CgkJbWVtc2V0KHZpcywgMCwgc2l6ZW9mIHZpcyk7IAoKCQljb3V0IDw8IGRwKG4sIG0sIG4sIG0pIDw8ICdcbic7IAoJfQp9CgpuYW1lc3BhY2Ugc3ViMyB7CgkvLyBkcFt4MV1beTFdW3gyXVt5Ml0gbMOgIHThu5VuZyBz4buRIMSRaeG7g20ga2luaCBuZ2hp4buHbSBs4bubbiBuaOG6pXQgxJHhuqF0IMSRxrDhu6NjIGtoaSBBbiDEkcOjIMSR4bq/biDDtCAoeDEsIHkxKSB2w6AgQsOsbmggxJHDoyDEkeG6v24gw7QgKHgyLCB5MikgCgkvLyBUYSBjw7M6IAoJLy8gCSAgIHgxICsgeTEgPSB4MiArIHkyICAKCS8vIDw9PiAgICB5MiAgID0geDEgKyB5MSAtIHgyICAKCS8vID0+ICB5MiBwaOG7pSB0aHXhu5ljIHbDoG8gMyB0aGFtIHPhu5EgY8OybiBs4bqhaQoJLy8gPT4gIGNo4buJIGPhuqduIGzGsHUgdGjDtG5nIHRpbiB4MSwgeTEsIHgyCgoJYm9vbCB2aXNbTl1bTV1bTl07ICAKCWludCBtZW1vW05dW01dW05dOyAgIAoKCWludCBkcChpbnQgeDEsIGludCB5MSwgaW50IHgyKSB7CgkJaW50IHkyID0geDEgKyB5MSAtIHgyOyAKCgkJaWYgKCFpbnNpZGUoeDEsIHkxKSB8fCAhaW5zaWRlKHgyLCB5MikpIHJldHVybiAtSU5GOyAgCgkJaWYgKHgxID09IDEgJiYgeTEgPT0gMSAmJiB4MiA9PSAxICYmIHkyID09IDEpIHJldHVybiAwOyAgIAoJCWlmICghY29ybmVyKHgxLCB5MSkgJiYgIWNvcm5lcih4MiwgeTIpICYmIHgxID09IHgyICYmIHkxID09IHkyKSByZXR1cm4gLUlORjsgICAKCQkKCQlpbnQmIGFucyA9IG1lbW9beDFdW3kxXVt4Ml07ICAKCQlpZiAodmlzW3gxXVt5MV1beDJdKSByZXR1cm4gYW5zOyAgIAoKCQl2aXNbeDFdW3kxXVt4Ml0gPSB0cnVlOyAgIAoKCQlhbnMgPSAtSU5GOyAgIAoJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CgkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CgkJCQlpbnQgcHJldl94MSA9IHgxIC0gZHhbaV0sIHByZXZfeTEgPSB5MSAtIGR5W2ldOyAgIAoJCQkJaW50IHByZXZfeDIgPSB4MiAtIGR4W2pdOyAgICAKCQkJCW1heGltaXplKGFucywgZHAocHJldl94MSwgcHJldl95MSwgcHJldl94MikgKyBhW3gxXVt5MV0gKyBhW3gyXVt5Ml0pOyAKCQkJfQoJCX0KCgkJcmV0dXJuIGFuczsgIAoJfQoKCXZvaWQgc29sdmUoKSB7CgkJbWVtc2V0KHZpcywgMCwgc2l6ZW9mIHZpcyk7IAoKCQljb3V0IDw8IGRwKG4sIG0sIG4pIDw8ICdcbic7IAoJfQp9CgoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuID4+IG07ICAKCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQlmb3IgKGludCBqID0gMTsgaiA8PSBtOyBqKyspIGNpbiA+PiBhW2ldW2pdOyAKCX0KCQoJaW50IHN1YnRhc2sgPSB3aGF0X3N1YnRhc2soKTsgCglpZiAoc3VidGFzayA9PSAyKSBzdWIyOjpzb2x2ZSgpOyAKCWlmIChzdWJ0YXNrID09IDMpIHN1YjM6OnNvbHZlKCk7IAp9