1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <bits/stdc++.h> using namespace std; const int N = 1e3 + 10; int n, m, a[N][N]; long long dp[N][N][3];
long long dfs(int i, int j, int k) { if (i < 1 || i > n || j < 1 || j > m) return dp[0][0][0]; if (i == 1 && j == 1) return dp[i][j][k] = a[i][j]; if (dp[i][j][k] != dp[0][0][0]) return dp[i][j][k];
if (k == 0) return dp[i][j][k] = max(dfs(i - 1, j, 0), dfs(i - 1, j, 1)) + a[i][j];
else if (k == 1) return dp[i][j][k] = max(dfs(i, j - 1, 0), max(dfs(i, j - 1, 1), dfs(i, j - 1, 2))) + a[i][j];
else if (k == 2) return dp[i][j][k] = max(dfs(i + 1, j, 1), dfs(i + 1, j, 2)) + a[i][j]; return dp[0][0][0]; }
int main(void) { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d", &a[i][j]);
memset(dp, -0x3f, sizeof dp);
long long t = max(dfs(n, m, 0), max(dfs(n, m, 1), dfs(n, m, 2))); cout << t; }
|