关于一类树形 DP 的复杂度
  • 板块学术版
  • 楼主fanypcd
  • 当前回复10
  • 已保存回复10
  • 发布时间2021/11/3 20:36
  • 上次更新2023/11/4 01:29:35
查看原帖
关于一类树形 DP 的复杂度
90027
fanypcd楼主2021/11/3 20:36

RT,就是和子树 size 有关的

比如这份:

void dfs1(int u, int pre)
{
	size[u] = 1;
	f[u][0] = f[u][1] = g[u][0] = g[u][1] = 0;
	for(int i = first[u]; i; i = Next[i])
	{
		int v = to[i];
		if(v == pre)
		{
			continue;
		}
		dfs1(v, u);
		size[u] += size[v];
		memcpy(tmpf, f[u], sizeof(tmpf)), memcpy(tmpg, g[u], sizeof(tmpg));
		for(int V = 1; V <= min(size[u], step); V++)
		{
			for(int k = min(size[v], V); k >= V + size[v] - size[u]; k--)
			{
				f[u][V] = min(f[u][V], min(f[v][k] + tmpg[V - k] + w[i], tmpf[V - k] + g[v][k] + 2 * w[i]));
				g[u][V] = min(g[u][V], g[v][k] + tmpg[V - k] + 2 * w[i]);
			}
		}
	}
	memcpy(memf[u], f[u], sizeof(memf[u])), memcpy(memg[u], g[u], sizeof(memg[u]));
	return;
}

如果这份代码一次转移的复杂度是 O(sizeu2)O({size_u}^2),那么在树上转移的总的复杂度是?

或者说这份代码的实际复杂度是(可能上面的假设是错的)?

2021/11/3 20:36
加载中...