求调代码
  • 板块CF41D Pawn
  • 楼主Bpds1110
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/3 18:47
  • 上次更新2025/2/4 08:52:03
查看原帖
求调代码
864150
Bpds1110楼主2025/2/3 18:47

Memory limit exceeded on test 4

#include <bits/stdc++.h>
#define int long long
int max(int x, int y) { return x > y ? x : y; }

const int N = 110; 
int n, m, k, a[N][N], f[N][N][N], prex[N][N][N], prey[N][N][N]; 

void print(int x, int y, int i) {
	if (x == n) return std::cout << y << "\n", void();
	int nx = prex[x][y][i], ny = prey[x][y][i], nk = (i - a[x][y] + k) % k; 
	print(nx, ny, nk);
	if (ny == y - 1) std::cout << "R";
	else std::cout << "L";
	return void(); 
}

signed main() {
//	std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
	
	std::cin >> n >> m >> k;
	for (int i = 1; i <= n; ++ i)	
		for (int j = 1; j <= m; ++ j) {
			char ch; std::cin >> ch;
			a[i][j] = ch - '0';
		}
	++ k;
	memset(f, -1, sizeof(f));
	for (int j = 1; j <= m; ++ j) f[n][j][a[n][j] % k] = max(f[n][j][a[n][j] % k], a[n][j]);
	for (int i = n; i >= 1; -- i) 
		for (int j = 1; j <= m; ++ j) 
			for (int h = 0; h < k; ++ h) {
				if (i + 1 <= n && j + 1 <= m && f[i + 1][j + 1][h] != -1 && f[i][j][(h + a[i][j]) % k] < f[i + 1][j + 1][h] + a[i][j])
					f[i][j][(h + a[i][j]) % k] = f[i + 1][j + 1][h] + a[i][j], 
					prex[i][j][(h + a[i][j]) % k] = i + 1, prey[i][j][(h + a[i][j]) % k] = j + 1; 
				if (i + 1 <= n && j + 1 <= m && f[i + 1][j - 1][h] != -1 && f[i][j][(h + a[i][j]) % k] < f[i + 1][j - 1][h] + a[i][j])
					f[i][j][(h + a[i][j]) % k] = f[i + 1][j - 1][h] + a[i][j], 
					prex[i][j][(h + a[i][j]) % k] = i + 1, prey[i][j][(h + a[i][j]) % k] = j - 1;
			}
	int ans = -1;
	for (int j = 1; j <= m; ++ j) ans = max(ans, f[1][j][0]);
	std::cout << ans << "\n"; 
	if (ans == -1) return 0; 
	for (int j = 1; j <= m; ++ j)
		if (f[1][j][0] == ans) {
			print(1, j, 0);
			break ; 
		}
	
	return 0; 
}
2025/2/3 18:47
加载中...