求助 分数60
查看原帖
求助 分数60
934466
KKKvX07楼主2024/6/7 14:13
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 10;
int grid[MAXN][MAXN];
int dp[MAXN][MAXN][MAXN][MAXN];

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

int main() {
    int N;
    cin >> N;
    memset(grid, 0, sizeof(grid));
    
    while (true) {
        int x, y, value;
        cin >> x >> y >> value;
        if (x == 0 && y == 0 && value == 0) break;
        grid[x-1][y-1] = value;
    }
    
    memset(dp, -1, sizeof(dp));
    dp[0][0][0][0] = grid[0][0];
    
    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) {
                    if (dp[x1][y1][x2][y2] == -1) continue;
                    int value = grid[x1][y1];
                    if (x1 != x2 || y1 != y2) value += grid[x2][y2];

                    if (x1 + 1 < N && x2 + 1 < N)
                        dp[x1 + 1][y1][x2 + 1][y2] = max(dp[x1 + 1][y1][x2 + 1][y2], dp[x1][y1][x2][y2] + value);
                    if (x1 + 1 < N && y2 + 1 < N)
                        dp[x1 + 1][y1][x2][y2 + 1] = max(dp[x1 + 1][y1][x2][y2 + 1], dp[x1][y1][x2][y2] + value);
                    if (y1 + 1 < N && x2 + 1 < N)
                        dp[x1][y1 + 1][x2 + 1][y2] = max(dp[x1][y1 + 1][x2 + 1][y2], dp[x1][y1][x2][y2] + value);
                    if (y1 + 1 < N && y2 + 1 < N)
                        dp[x1][y1 + 1][x2][y2 + 1] = max(dp[x1][y1 + 1][x2][y2 + 1], dp[x1][y1][x2][y2] + value);
                }
            }
        }
    }
    
    cout << dp[N-1][N-1][N-1][N-1] << endl;
    
    return 0;
}
2024/6/7 14:13
加载中...