1
+ /* *
2
+ * @file 2068.cpp
3
+ * @author Macesuted ([email protected] )
4
+ * @date 2022-12-07
5
+ *
6
+ * @copyright Copyright (c) 2022
7
+ *
8
+ */
9
+
10
+ #include < bits/stdc++.h>
11
+ using namespace std ;
12
+
13
+ #ifndef LOCAL
14
+ #define endl ' \n '
15
+ #endif
16
+
17
+ bool mem1;
18
+
19
+ #define maxn 805
20
+
21
+ int64_t a[maxn][maxn], sum[maxn][maxn], fl[maxn][maxn], fr[maxn][maxn], gl[maxn][maxn], gr[maxn][maxn], h[maxn][2 ];
22
+
23
+ int64_t _ (int xl, int xr, int yl, int yr) { return sum[xr][yr] - sum[xl - 1 ][yr] - sum[xr][yl - 1 ] + sum[xl - 1 ][yl - 1 ]; }
24
+ int64_t dp (int n, int m) {
25
+ for (int i = 1 ; i <= n; i++)
26
+ for (int j = 1 ; j <= m; j++) sum[i][j] = sum[i][j - 1 ] + a[i][j];
27
+ for (int i = 1 ; i <= n; i++)
28
+ for (int j = 1 ; j <= m; j++) sum[i][j] += sum[i - 1 ][j];
29
+ for (int i = 0 ; i <= n + 1 ; i++)
30
+ for (int j = 0 ; j <= m + 1 ; j++) fl[i][j] = fr[i][j] = gl[i][j] = gr[i][j] = -1e18 ;
31
+ fl[1 ][1 ] = fr[1 ][1 ] = a[1 ][1 ], gl[n][m] = gr[n][m] = a[n][m];
32
+ for (int i = 1 ; i <= n; i++)
33
+ for (int j = 1 + (i == 1 ); j <= m; j++)
34
+ fl[i][j] = max ({fl[i][j - 1 ], fl[i - 1 ][j] + a[i][1 ], fr[i - 1 ][j - 1 ] + _ (i, i, 1 , j) + _ (1 , i - 1 , j, j)}),
35
+ fr[i][j] = max ({fr[i - 1 ][j], fr[i][j - 1 ] + a[1 ][j], fl[i - 1 ][j - 1 ] + _ (i, i, 1 , j) + _ (1 , i - 1 , j, j)});
36
+ for (int i = n; i; i--)
37
+ for (int j = m - (i == n); j; j--)
38
+ gl[i][j] = max ({gl[i + 1 ][j], gl[i][j + 1 ] + a[n][j], gr[i + 1 ][j + 1 ] + _ (i, i, j, m) + _ (i + 1 , n, j, j)}),
39
+ gr[i][j] = max ({gr[i][j + 1 ], gr[i + 1 ][j] + a[i][n], gl[i + 1 ][j + 1 ] + _ (i, i, j, m) + _ (i + 1 , n, j, j)});
40
+ int64_t ans = 0 ;
41
+ for (int i = 1 ; i <= n; i++) h[i][0 ] = fl[i][m], h[i][1 ] = -1e18 ;
42
+ for (int j = 1 ; j <= m; j++) {
43
+ int64_t val = -1e18 ;
44
+ for (int i = 1 ; i <= n; i++) {
45
+ val = max (val + a[i][m], _ (1 , i, j, j) + _ (i, i, j + 1 , m));
46
+ h[i][1 ] = max (h[i][1 ], (j == 1 ? 0 : fr[i][j - 1 ]) + val);
47
+ }
48
+ }
49
+ for (int i = 2 ; i <= n; i++)
50
+ h[i][0 ] = max ({h[i][0 ], h[i - 1 ][0 ] + a[i][1 ], h[i - 1 ][1 ] + _ (i, i, 1 , m)}),
51
+ h[i][1 ] = max ({h[i][1 ], h[i - 1 ][1 ] + a[i][m], h[i - 1 ][0 ] + _ (i, i, 1 , m)});
52
+ ans = max (ans, h[n][1 ]);
53
+ for (int i = 1 ; i <= n; i++) ans = max (ans, h[i - 1 ][1 ] + gr[i][m]);
54
+ for (int j = 1 ; j <= m; j++) {
55
+ int64_t val = -1e18 ;
56
+ for (int i = n; i; i--) {
57
+ val = max (val + a[i][1 ], _ (i, n, j, j) + _ (i, i, 1 , j - 1 ));
58
+ ans = max (ans, h[i - 1 ][0 ] + (j == m ? 0 : gl[i][j + 1 ]) + val);
59
+ }
60
+ }
61
+ return ans;
62
+ }
63
+
64
+ void solve (void ) {
65
+ int n, m;
66
+ cin >> n >> m;
67
+ for (int i = 1 ; i <= n; i++)
68
+ for (int j = 1 ; j <= m; j++) cin >> a[i][j];
69
+ int64_t ans = dp (n, m);
70
+ for (int i = 1 ; i <= max (n, m); i++)
71
+ for (int j = 1 ; j < i; j++) swap (a[i][j], a[j][i]);
72
+ cout << max (ans, dp (m, n)) << endl;
73
+ return ;
74
+ }
75
+
76
+ bool mem2;
77
+
78
+ int main () {
79
+ ios::sync_with_stdio (false ), cin.tie (nullptr );
80
+ #ifdef LOCAL
81
+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
82
+ #endif
83
+
84
+ int _ = 1 ;
85
+ while (_--) solve ();
86
+
87
+ #ifdef LOCAL
88
+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
89
+ #endif
90
+ return 0 ;
91
+ }
0 commit comments