1 #include <bits/stdc++.h> 2 using namespace std; 3 int mp[55][55]; //好心程度 | 权值 4 int dp[55][55][55][55]; 5 int maxPath(int m, int n) { 6 for (int x1 = 1; x1 <= m; x1++) { 7 for (int y1 = 1; y1 <= n; y1++) { 8 for (int x2 = 1; x2 <= m; x2++) { 9 for (int y2 = 1; y2 <= n; y2++) { 10 if ((x1 < m || y1 < n) && x1 == x2 && y1 == y2) { 11 continue; 12 } 13 dp[x1][y1][x2][y2] = max(max(dp[x1 - 1][y1][x2 - 1][y2], dp[x1 - 1][y1][x2][y2 - 1]), 14 max(dp[x1][y1 - 1][x2 - 1][y2], dp[x1][y1 - 1][x2][y2 - 1])) 15 + mp[x1][y1] + mp[x2][y2]; 16 } 17 } 18 } 19 } 20 return dp[m][n][m][n]; 21 } 22 int main() { 23 int m, n; 24 cin >> m >> n; 25 for (int i = 1;i <= m; i++) { 26 for (int j = 1;j <= n; j++) { 27 cin >> mp[i][j]; 28 } 29 } 30 int ans = maxPath(m, n); 31 cout << ans << endl; 32 return 0; 33 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 int mp[55][55]; //好心程度 | 权值 4 int dp[55 + 55][55][55]; 5 int maxPath(int m, int n) { 6 for (int k = 1; k <= m + n - 3; k++) { 7 for (int x1 = 0; x1 <= k; x1++) { 8 for (int x2 = 0; x2 <= k; x2++) { 9 if (x1 == x2) { //x1 == x2 相当于(x1 == x2 && y1 = y2) 10 continue; 11 } 12 dp[k][x1][x2] = max(max(dp[k - 1][x1][x2], dp[k - 1][x1 - 1][x2 - 1]), 13 max(dp[k - 1][x1 - 1][x2], dp[k - 1][x1][x2 - 1])) 14 + map[x1][k - x1] + map[x2][k - x2]; 15 } 16 } 17 } 18 return dp[m + n - 3][m - 1][m - 2]; 19 } 20 int main() { 21 int m, n; 22 cin >> m >> n; 23 for (int i = 0; i < m; i++) { 24 for (int j = 0; j < n; j++) { 25 cin >> mp[i][j]; 26 } 27 } 28 int ans = maxPath(m, n); 29 cout << ans << endl; 30 return 0; 31 }
原文:https://www.cnblogs.com/fx1998/p/12697293.html