#include #include #include #include #include #include #include #include #include #include #include #include #include #define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl; #define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; typedef long long ll; template vector> vec2d(int n, int m, T v){ return vector>(n, vector(m, v)); } template vector>> vec3d(int n, int m, int k, T v){ return vector>>(n, vector>(m, vector(k, v))); } template void print_vector(vector v, char delimiter=' '){ if(v.empty()) { cout << endl; return; } for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter; cout << v.back() << endl; } using P = pair; using T = tuple; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout << setprecision(10) << fixed; int h, w; cin >> h >> w; auto a = vec2d(h, w, 0); for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ cin >> a[i][j]; } } vector

ps = { {1, -1}, {1, 0}, {1, 1}, {0, 1}, }; map mp; for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ for(auto [s, t]: ps){ int x = s*i+t*j; T key = {x, s, t}; if(mp.count(key)) mp[key] += a[i][j]; else mp[key] = a[i][j]; } } } int ans = 0; for(auto [k0, v0]: mp){ auto [x0, s0, t0] = k0; for(auto [k1, v1]: mp){ auto [x1, s1, t1] = k1; if(k0 == k1){ chmax(ans, v0); continue; } if(s0 == s1 && t0 == t1){ chmax(ans, v0+v1); continue; } int P = x0*t1-t0*x1; int Q = s0*x1-s1*x0; int R = s0*t1-t0*s1; if(P%R == 0 && Q%R == 0){ int x = P/R, y = Q/R; if(0 <= x && x < h && 0 <= y && y < w){ chmax(ans, v0+v1-a[x][y]); continue; } } chmax(ans, v0+v1); } } cout << ans << endl; }