原题传送门 #include <bits/stdc++.h> using namespace std; int mp[15][15]; int f[15][15][15][15];//将走到目的地回头转化为两个人从起点开始走,f[i][j][k][l]表示两人走到(i,j)和(k,l)时的最大值 int Max(int a, int b, int c, int d)//取最大值函数 { int ans = a; if (b > a) { ans = b; } if (c > ans) { ans = c; } if (d > ans) { ans = d; } return ans; } int main() { int n; cin >> n; int x, y, val; cin >> x >> y >> val; while (!(x == 0 && y == 0 && val == 0)) { mp[x][y] = val; cin >> x >> y >> val; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { for (int k = 1; k <= n; k++) { for (int l = 1; l <= n; l++) { 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]) + mp[i][j] + mp[k][l];//状转方程 if (i == k && j == l)//如果两人重合 { f[i][j][k][l] -= mp[i][j];//被加了两次,减回去 } } } } } cout << f[n][n][n][n] << endl; }