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

猜你喜欢

转载自www.cnblogs.com/pipa-peng/p/12519510.html