问题本质是从左上角到右下角的两条不相交路劲,权值最大
1--动态规划(二进程动态规划) 或者 网格图费用流
确定好转移状态吧
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define maxn 60 using namespace std; int dp[maxn*2][maxn][maxn]; int map[maxn][maxn]; int n, m; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &map[i][j]); } } for (int i = 2; i <= n + m; i++) { for (int x = max(1, i - m); x <= n && x < i; x++) { for (int y = max(1, i - m); y <= n && y < i; y++) { int t = map[y][i - y]; t += map[x][i - x]; if (x != y || i == 2 || i == n + m ) { dp[i][x][y] = max(dp[i][x][y], dp[i-1][x][y] + t); dp[i][x][y] = max(dp[i][x][y], dp[i - 1][x - 1][y] + t); dp[i][x][y] = max(dp[i][x][y], dp[i - 1][x][y - 1] + t); dp[i][x][y] = max(dp[i][x][y], dp[i - 1][x - 1][y - 1] + t); } } } } printf("%d\n", dp[m + n][n][n]); return 0; }