洛谷1006 传纸条

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

你可能感兴趣的:(洛谷1006 传纸条)