求大神看看三维dp,为什么不能用回溯写qwq
查看原帖
求大神看看三维dp,为什么不能用回溯写qwq
1500557
AAA0721ciallo楼主2024/12/11 20:14
#include<iostream>//万能头文件 
using namespace std;
int cnt = 0;
int N;
int board[10][10];
int dp[10][10][3];
bool visited[10][10];
int dfs(int x, int y, int time) {
	if (dp[x][y][time] != -1) { return dp[x][y][time]; }
	int ans = 0, tempans = 0; bool flag =false;
	if (!visited[x][y]) { ans = board[x][y]; tempans = board[x][y]; visited[x][y] = true; flag = true; }
	if (x == N && y == N && time == 2) { return 0;}
	if (x == N && y == N && time == 1) { ans += dfs(1, 1, 2); if (flag) { visited[x][y] = false; }; return ans;}
	if (x == N) { ans += dfs(x, y + 1, time); if (flag) { visited[x][y] = false; }; return ans; }//为啥改为false;
	if (y == N) { ans += dfs(x + 1, y, time); if (flag) { visited[x][y] = false; }; return ans; }
	else {
		ans += dfs(x + 1, y, time); tempans += dfs(x, y + 1, time);
		ans = max(ans, tempans);
		dp[x][y][time] = ans;
	}
	if (flag) { visited[x][y] = false;};
	return ans;
}
int main() {
	int num,x,y;
	cin >> N;
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= 9; j++) {
			board[i][j] = 0;
			dp[i][j][1] = -1; dp[i][j][2] = -1;
		}
	}
	while (cin >> x >> y >> num) { if (x == 0 && y == 0 && num == 0) { break; }board[x][y] = num; }
	int result=dfs(1, 1, 1);
	cout << result << endl;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			cout << dp[i][j][1] << " ";
		}cout << endl;
	}cout << endl;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			cout << dp[i][j][2] << " ";
		}cout << endl;
	}cout << endl;
	return 0;
}
2024/12/11 20:14
加载中...