调了一个上午。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int n, m;
int a[1010][1010];
int f[1010][1010][5];
int INF = numeric_limits<int>::min();
int dfs(int i, int j, int k) {
if (1 > i || i > n) return 0;
if (1 > j || j > m) return 0;
if (f[i][j][k] != INF) return f[i][j][k];
if (k == 0) {
f[i][j][0] = max(max(dfs(i, j - 1, 0), dfs(i, j - 1, 1)), dfs(i, j - 1, 2)) + a[i][j];
}
if (k == 1) {
f[i][j][1] = max(dfs(i - 1, j, 0), dfs(i - 1, j, 1)) + a[i][j];
}
if (k == 2) {
f[i][j][2] = max(dfs(i + 1, j, 0), dfs(i + 1, j, 2)) + a[i][j];
}
return f[i][j][k];
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
f[i][j][0] = f[i][j][1] = f[i][j][2] = INF;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int k = 0; k < 3; k++) {
dfs(i, j, k);
}
}
}
cout << max(max(f[n][m][0], f[n][m][1]), f[n][m][2]) << endl;
return 0;
}