1 2 3 4

传递纸条

问题本质是从左上角到右下角的两条不相交路劲,权值最大

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;
}

  

posted @ 2019-12-05 12:29  Lesning  阅读(162)  评论(0编辑  收藏  举报