1. 程式人生 > 其它 >計蒜客 T2091 傳紙條

計蒜客 T2091 傳紙條

題目連結:計蒜客 T2091 傳紙條

題目大意:

題解:
由題意可知兩路不會相交,設\(dp[i][j][k]\)表示下面的那條路走到\((i,j)\),上面那條路走到\((k, i+j-k)\)時好感程度的最大值,則狀態轉移方程為:

\[dp[i][j][k] = max\{dp[i - 1][j][k - 1], dp[i - 1][j][k],dp[i][j - 1][k - 1], dp[i][j - 1][k]\}+a[i][j] + a[k][i + j - k],i\neq k \]

由於\(i\neq k\),所以答案不能直接輸出\(dp[n][m][n]\),因為右下角的好感程度一定為\(0\)

,所以輸出右下角的上一步\(dp[n][m-1][n-1]\)

#include <iostream>
using namespace std;

int dp[100][100][100], n, m, a[51][51];

int max_4(int a, int b, int c, int d) { return max(a, max(b, max(c, d))); }

int main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> a[i][j];
        }
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            for (int k = 1; k < i; ++k) {
                if (i != k) {
                    dp[i][j][k] = max_4(dp[i - 1][j][k - 1], dp[i - 1][j][k], dp[i][j - 1][k - 1], dp[i][j - 1][k]) + a[i][j] + a[k][i + j - k];
                }
            }
        }
    }
    cout << dp[n][m - 1][n - 1];
    return 0;
}