如题,我是dfs(x1,y1,x2,y2,nowsum)一起出发的,应该设置一个数组nowmax[][][][]记录在这个位置出现的最大值吗,然后后来到这里的就直接不走这条路了?这么做了为啥还是220ms啊
int now[10][10][10][10];//记录此位置出现最大值
int map[10][10] = {0} ;//map[x][y]表示x行y列
int X1[4] = {0, 1, 0, 1};
int Y1[4] = {1, 0, 1, 0};
int X2[4] = {0, 1, 1, 0};
int Y2[4] = {1, 0, 0, 1};
int n, sum = -1;
void dfs(int x1, int y1, int x2, int y2, int nowsum) {
if (x1 == n && y1 == n ) { //肯定是一起到的
if (nowsum > sum) {
sum = nowsum;
}
} else if (now[x1][y1][x2][y2] > nowsum ) { //来过并且值小于他,没必要继续
return;
} else {
for (int i = 0; i < 4; i++) {
int a1 = x1 + X1[i], b1 = y1 + Y1[i];
int a2 = x2 + X2[i], b2 = y2 + Y2[i];
if (1 <= a1 && a1 <= n && 1 <= b1 && b1 <= n && 1 <= a2 && a2 <= n && 1 <= b2 && b2 <= n) {
if (a1 == a2) {
nowsum += map[a1][b1];//在一起
// map[a1][b1]=0;
if (now[a1][b1][a2][b2] < nowsum)
now[a1][b1][a2][b2] = nowsum;
dfs(a1, b1, a2, b2, nowsum);
nowsum -= map[a1][b1];
} else {
nowsum += map[a1][b1] + map[a2][b2];//各自走各自的
if (now[a1][b1][a2][b2] < nowsum)
now[a1][b1][a2][b2] = nowsum;
dfs(a1, b1, a2, b2, nowsum);
// map[a1][b1]=0;
nowsum -= map[a1][b1] + map[a2][b2];
}
}
}
}
}
int main() {
cin >> n;
int aa, bb, cc;
for (int i = 0;; i++) {
cin >> aa >> bb >> cc;
if (aa == 0 && bb == 0 && cc == 0) {
break;
} else
map[aa][bb] = cc;
}
memset(now, -1, sizeof(now));
dfs(1, 1, 1, 1, map[1][1]); //同时从11,11,当前和为地点值
cout << sum;
return 0;
}