萌新求助关于树形背包上的滚动数组
查看原帖
萌新求助关于树形背包上的滚动数组
298549
SIXIANG32楼主2023/8/26 16:48

如题。

我本来是这么写的

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5, M = 1e2, Mod = 1e9 + 7;
vector <int> gra[N + 10];
int f[N + 10][M + 10][2][2], siz[N + 10], n, m;
int tmp[N + 10][M + 10][2][2];
void prepare(int u, int fa) {
	siz[u] = 1;
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v == fa) continue;
		prepare(v, u);
		siz[u] += siz[v];
	}
}
void add(int &x, int y) {x = (x + y) % Mod;}
void dfs(int u, int fa) {
	int lim = 1, child = 0;

	f[u][1][1][0] = 1;
	f[u][0][0][0] = 1;
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v == fa) continue;
		dfs(v, u);
		child++;

		for(int i = 0; i <= m; i++) {
			tmp[u][i][0][0] = f[u][i][0][0];
			tmp[u][i][0][1] = f[u][i][0][1];
			tmp[u][i][1][0] = f[u][i][1][0];
			tmp[u][i][1][1] = f[u][i][1][1];
		}
		for(int k = 0; k <= min(lim, m); k++) {
			for(int x = 0; x <= min(siz[v], m - k); x++) {
				add(tmp[u][k + x][0][0], (f[u][k][0][0] * f[v][x][0][1]));
				add(tmp[u][k + x][1][0], (f[u][k][1][0] * (f[v][x][0][1] + f[v][x][0][0])));
				add(tmp[u][k + x][0][1], (f[u][k][0][0] * f[v][x][1][1] + f[u][k][0][1] * (f[v][x][1][1] + f[v][x][0][1])));
				add(tmp[u][k + x][1][1], (f[u][k][1][0] * (f[v][x][1][0] + f[v][x][1][1]) +
					f[u][k][1][1] * (f[v][x][1][1] + f[v][x][1][0] + f[v][x][0][1] + f[v][x][0][0])));
			}
		}
		for(int i = 0; i <= m; i++) {
			f[u][i][0][0] = tmp[u][i][0][0];
			f[u][i][0][1] = tmp[u][i][0][1];
			f[u][i][1][0] = tmp[u][i][1][0];
			f[u][i][1][1] = tmp[u][i][1][1];
		}
	}
}
int main() {
	cin >> n >> m;
	for(int p = 1, x, y; p < n; p++) {
		cin >> x >> y;
		gra[x].push_back(y);
		gra[y].push_back(x);
	}
	prepare(1, 0);
	dfs(1, 0);
	cout << (f[1][m][0][1] + f[1][m][1][1]) << endl;
}

这里面的 tmp 代表的是合并完第 ii 个儿子后的值。然后我发现我的样例 WA 掉了,怎么调也调不对,然后去剽题解去了 QAQ改成了酱紫

for(int i = 0; i <= min(lim, m); i++) {
			tmp[u][i][0][0] = f[u][i][0][0], f[u][i][0][0] = 0;
			tmp[u][i][0][1] = f[u][i][0][1], f[u][i][0][1] = 0;
			tmp[u][i][1][0] = f[u][i][1][0], f[u][i][1][0] = 0;
			tmp[u][i][1][1] = f[u][i][1][1], f[u][i][1][1] = 0;
		}
		for(int k = 0; k <= min(lim, m); k++) {
			for(int x = 0; x <= min(siz[v], m - k); x++) {
				add(f[u][k + x][0][0], 1ll * tmp[u][k][0][0] * 1ll * f[v][x][0][1] % Mod);
				add(f[u][k + x][1][0], 1ll * tmp[u][k][1][0] * (1ll * f[v][x][0][1] + 1ll * f[v][x][0][0]) % Mod);
				add(f[u][k + x][0][1], (1ll * tmp[u][k][0][0] * 1ll * f[v][x][1][1] + 1ll * tmp[u][k][0][1] * (1ll * f[v][x][1][1] + 1ll * f[v][x][0][1])) % Mod);
				add(f[u][k + x][1][1], 1ll * tmp[u][k][1][0] * 1ll * (1ll * f[v][x][1][0] + 1ll * f[v][x][1][1]) % Mod);
				add(f[u][k + x][1][1], 1ll * tmp[u][k][1][1] * 1ll * (1ll * f[v][x][1][1] + 1ll * f[v][x][1][0] + 1ll * f[v][x][0][1] + 1ll * f[v][x][0][0]));
			}
		}

就过了,不是很理解 QAQ 求巨佬指教 QAQ

2023/8/26 16:48
加载中...