原代码(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;
}
求大佬帮我看一看哪错了嘤嘤嘤???