dfs同步出发怎么优化
查看原帖
dfs同步出发怎么优化
159264
Lvxiaomao楼主2021/12/6 11:40

如题,我是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;
}

2021/12/6 11:40
加载中...