返回顶部
扩大
缩小

2020.3.17 Luogu1006 传纸条

看成从 \((1,1)\) 走的两条不相交路径,求好心程度和的最大值
根据 \(1 \leq m, n \leq 50\),四维DP即可
\(f[i, j, k, l] = max\{ f[i - 1, j, k - 1, l], f[i - 1, j, k, l - 1], f[i, j - 1, k - 1, l], f[i, j - 1, k, l - 1]\} + a[i,j] + a[k,l]\)
\(i==k \bigwedge j==l \bigwedge (i, j) != (m, n) \bigwedge (k, l) != (m, n)\)\(f[i, j, k, l] = -INF\)
记忆化搜索即可

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 55;
const int INF = -99999999;

int n, m, a[N][N];
int f[N][N][N][N];

inline int F(int i, int j, int k, int l)
{
	if (f[i][j][k][l] != -1)
		return f[i][j][k][l];
	if (i <= 0 || i > m || j <= 0 || j > n || k <= 0 || k > m || j <= 0 || j > n)
		return INF;
	f[i][j][k][l] = max(F(i - 1, j, k - 1, l), max(F(i - 1, j, k, l - 1), max(F(i, j - 1, k - 1, l), F(i, j - 1, k, l - 1)))) + a[i][j] + a[k][l];
	if (i == k && j == l && !(i == m && j == n && k == m && l == n))
		f[i][j][k][l] = INF;
	return f[i][j][k][l];
}

int main()
{
	ios::sync_with_stdio(false);
	cin >> m >> n;
	for (int i = 1; i <= m; ++i)
		for (int j = 1; j <= n; ++j)
			cin >> a[i][j];
	memset(f, -1, sizeof f);
	f[1][1][1][1] = 0;
	cout << F(m, n, m, n) << endl;
	return 0;
}
posted @ 2020-03-18 19:17  Asasino  阅读(83)  评论(0编辑  收藏  举报