Skip to content

Commit f248e92

Browse files
committed
LibreOJ: 2068
「SDOI2016」探险路线
1 parent a04126b commit f248e92

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

LibreOJ/2068.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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

Comments
 (0)