#include using namespace std; struct iofast_t { iofast_t() { ios::sync_with_stdio(false); cin.tie(nullptr); } } iofast; struct uns_t {} uns; template auto vec(Element init, Head arg, Args ...args) { if constexpr (sizeof...(Args) == 0) return vector(arg, init); else return vector(arg, vec(init, args...)); } template auto vec(uns_t, Head arg, Args ...args) { return vec(Element(), arg, args...); } template auto distance(const Container &c, decltype(begin(c)) iter) { return distance(begin(c), iter); } template ::value_type>> auto isort(RIter first, RIter last, Compare comp = Compare()) { vector i(distance(first, last)); iota(begin(i), end(i), 0); sort(begin(i), end(i), [&](auto x, auto y) { return comp(*(first + x), *(first + y)); }); return i; } template typename, typename = void_t<>> struct detect : false_type {}; template typename Check> struct detect>> : true_type {}; template typename Check> constexpr inline bool detect_v = detect::value; template using has_member_sort = decltype(declval().sort()); template > auto sorted(Container c, Compare comp = Compare()) { if constexpr (detect_v) { c.sort(comp); return c; } else { sort(begin(c), end(c), comp); return c; } } template > auto uniqued(Container c, Compare comp = Compare()) { c.erase(unique(begin(c), end(c), comp), end(c)); return c; } template > T &chmin(T &l, T r, Compare &&f = less()) { return l = min(l, r, f); } template > T &chmax(T &l, T r, Compare &&f = less()) { return l = max(l, r, f); } template constexpr auto fix(F &&f) noexcept { return [f = std::tuple(std::forward(f))](auto &&...args) mutable { return std::get<0>(f)(fix(std::get<0>(f)), std::forward(args)...); }; } int main() { int h, w; cin >> h >> w; auto a = vec(uns, h, w); for (auto &r : a) { for (auto &e : r) { cin >> e; } } auto b = vec(uns, h + w - 1, h + w - 1); for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { b[w - 1 + i - j][i + j] = a[i][j]; } } auto f = [](int h, int w, const auto &v) { int ans = 0; for (int i = 0; i < h; ++i) { int x = 0; for (int k = 0; k < w; ++k) { x += v[i][k]; } chmax(ans, x); for (int j = i + 1; j < h; ++j) { int y = 0; for (int k = 0; k < w; ++k) { y += v[j][k]; } chmax(ans, x + y); } } return ans; }; auto g = [](int h, int w, const auto &v) { auto r = vec(uns, h); auto c = vec(uns, w); for (int i = 0; i < h; ++i) { int sum = 0; for (int j = 0; j < w; ++j) { sum += v[i][j]; } r[i] = sum; } for (int i = 0; i < w; ++i) { int sum = 0; for (int j = 0; j < h; ++j) { sum += v[j][i]; } c[i] = sum; } int ans = 0; for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { chmax(ans, r[i] + c[j] - v[i][j]); } } return ans; }; auto s = [](int h, int w, const auto &v) { auto r = vec(uns, h); for (int i = 0; i < h; ++i) { int sum = 0; for (int j = 0; j < w; ++j) { sum += v[i][j]; } r[i] = sum; } int ans = 0; for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { int d1 = min(i, j); int d2 = min(i, w - j - 1); int sum1 = 0; for (int k = 0; i - d1 + k < h && j - d1 + k < w; ++k) { sum1 += v[i - d1 + k][j - d1 + k]; } int sum2 = 0; for (int k = 0; i - d2 + k < h && 0 <= j + d2 - k; ++k) { sum2 += v[i - d2 + k][j + d2 - k]; } chmax(ans, r[i] + max(sum1, sum2) - v[i][j]); } } return ans; }; auto rot = [](int h, int w, const auto &v) { auto u = vec(uns, w, h); for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { u[j][h - i - 1] = v[i][j]; } } return u; }; int ans = 0; chmax(ans, f(h, w, a)); chmax(ans, f(w, h, rot(h, w, a))); chmax(ans, f(h + w - 1, h + w - 1, b)); chmax(ans, f(h + w - 1, h + w - 1, rot(h + w - 1, h + w - 1, b))); chmax(ans, g(h, w, a)); chmax(ans, g(h + w - 1, h + w - 1, b)); chmax(ans, s(h, w, a)); chmax(ans, s(w, h, rot(h, w, a))); cout << ans << endl; }