求助!!
查看原帖
求助!!
330014
幻夢の雨楼主2020/4/29 10:15

原代码(AC):

#include<bits/stdc++.h>
using namespace std;
#define MAX 11
int f[MAX][MAX][MAX][MAX], a[MAX][MAX], n;

int main(){
    cin >> n;
    while(1){
        int x, y, z;
        cin >> x >> y >> z;
        if(x == 0 && y == 0 && z == 0) break;
        a[x][y] = z;
    }
    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][k][l] = max(f[i][j][k][l], f[i][j - 1][k - 1][l]);
                    f[i][j][k][l] = max(f[i][j][k][l], f[i][j - 1][k][l - 1]) + a[i][j] + a[k][l];
                    if(i == k && l == j) f[i][j][k][l] -= a[i][j];
                }
            }
        }
    }
    cout << f[n][n][n][n];

    return 0;
}

然后把代码改了一下(递归,WA了4个点): 这个代码的意思就是:
考虑有2个人同时在上面走,记录第一个人的x值为x1,第二个人的x值为x2,steps记录走了多少步
蒟蒻的动态转移方程:

f(x1,x2,steps)=max(f(x1−1,x2,steps−1),f(x1−1,x2−1,steps−1),f(x1,x2−1,steps−1),f(x1,x2, steps - 1)
#include<bits/stdc++.h>
using namespace std;
#define MAX 11
int f[MAX][MAX][101], a[MAX][MAX], n;
bool v[MAX][MAX][101];

int dp(int x1, int x2, int steps){
    if(x1 < 1 || x2 < 1 || steps < 1) return 0;
    if(!v[x1][x2][steps]){
        v[x1][x2][steps] = true;
        int y1 = steps + 1 - x1, y2 = steps + 1 - x2;
        f[x1][x2][steps] = max(dp(x1 - 1, x2, steps - 1), max(dp(x1 - 1, x2 - 1, steps - 1), max(dp(x1, x2, steps - 1), dp(x1, x2 - 1, steps - 1))));
        f[x1][x2][steps] += a[x1][y1] + a[x2][y2];
        if(x1 == x2) f[x1][x2][steps] -= a[x1][y1];
    }
    return f[x1][x2][steps];
}

int main(){
    cin >> n;
    while(1){
        int x, y, z;
        cin >> x >> y >> z;
        if(x == 0 && y == 0 && z == 0) break;
        a[x][y] = z;
    }
    cout << dp(n, n, 2 * n - 1);

    return 0;
}

求大佬帮我看一看哪错了嘤嘤嘤???

2020/4/29 10:15
加载中...