https://www.luogu.org/problem/show?pid=1006 传纸条
dp水题,三维即可,无需开四维状态。这题可以认为2人同时从(1,1)到(n,m)走,不能相遇。
f[x1][y1][x2]
表示一人走到(x1,y1)、第二个人横坐标是x2时的最大好感值,此时可以确定第二个人纵坐标,为x1+y1-y2(利用两人路程相等)。每个人都可以从左、上两个方向转移过来,共4种情况取max,然后分别加上当前点的好感度,注意如果当前位置重合只计算一次,即可写出转移方程(见代码)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int f[N][N][N], a[N][N];
int main () {
int n, m, c1, c2; scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j) scanf ("%d", &a[i][j]);
for (int x1 = 1; x1 <= n; ++ x1)
for (int y1 = 1; y1 <= m; ++ y1)
for (int x2 = 1; x2 <= n; ++ x2) {
int y2 = x1+y1-x2;
if (y2>m || y2<1) continue;
c1 = max (f[x1-1][y1][x2-1], f[x1-1][y1][x2]);
c2 = max (f[x1][y1-1][x2-1], f[x1][y1-1][x2]);
f[x1][y1][x2] = max (c1, c2) + a[x1][y1];
if (x1!=x2 || y1!=y2) f[x1][y1][x2] += a[x2][y2];
}
printf ("%d\n", f[n][m][n]);
return 0;
}