代码:
#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;