四维DP思路(42分)
查看原帖
四维DP思路(42分)
1589442
hirundapus楼主2024/11/27 11:49

代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int INF = -1e9; // 表示非法状态
int N;
vector<vector<int> > grid;
// 定义四维 DP
int dp[9][9][9][9];

int main() {
    // 输入
    cin >> N;
    grid.assign(N, vector<int>(N, 0));
    int x, y, val;
    while (cin >> x >> y >> val, x || y || val) {
        grid[x - 1][y - 1] = val;
    }

    // 初始化 DP
    for (int x1 = 0; x1 < N; ++x1)
        for (int y1 = 0; y1 < N; ++y1)
            for (int x2 = 0; x2 < N; ++x2)
                for (int y2 = 0; y2 < N; ++y2)
                    dp[x1][y1][x2][y2] = INF;

    dp[0][0][0][0] = grid[0][0]; // 起点

    // DP 递推
    for (int x1 = 0; x1 < N; ++x1) {
        for (int y1 = 0; y1 < N; ++y1) {
            for (int x2 = 0; x2 < N; ++x2) {
                for (int y2 = 0; y2 < N; ++y2) {
                    int y2_actual = x1 + y1 - x2; // 保证两人步数相同
                    if (y2_actual < 0 || y2_actual >= N) continue; // 越界,跳过

                    int &cur = dp[x1][y1][x2][y2];
                    cur = max(cur, (x1 > 0 && x2 > 0 ? dp[x1-1][y1][x2-1][y2] : INF));
                    cur = max(cur, (x1 > 0 && y2 > 0 ? dp[x1-1][y1][x2][y2-1] : INF));
                    cur = max(cur, (y1 > 0 && x2 > 0 ? dp[x1][y1-1][x2-1][y2] : INF));
                    cur = max(cur, (y1 > 0 && y2 > 0 ? dp[x1][y1-1][x2][y2-1] : INF));

                    if (cur == INF) continue; // 无效状态,跳过

                    // 更新当前格子值
                    if (x1 == x2 && y1 == y2) {
                        // 两人走到同一个格子,只加一次值
                        cur += grid[x1][y1];
                    } else {
                        // 两人走到不同的格子,分别加上两个格子的值
                        cur += grid[x1][y1] + grid[x2][y2];
                    }
                }
            }
        }
    }

    // 输出答案
    cout << dp[N-1][N-1][N-1][N-1] << endl;

    return 0;
}

3 1 1 10 1 3 5 2 2 6 2 3 4 3 1 8 3 2 2 0 0 0 答案为30,而输出为40 求debug;

2024/11/27 11:49
加载中...