树上背包优化 - 时间复杂度证明

发布时间 2023-08-23 17:08:06作者: huangqixuan

树上背包优化 - 时间复杂度证明

  • 树上背包顾名思义,就是在树上做背包 dp
  • 树上背包的模板代码如下
void dfs(int x){
	sz[x] = 1;
	if(x >= n - m + 1){
		dp[x][1] = -a[x];
		return;
	}
	for(PII e : eg[x]){
		int nxt = e.first;
		dfs(nxt);
		sz[x] += sz[nxt];
		for(int j = m; j >= 0; j--){
			for(int h = 1; h <= j; h++){
				dp[x][j] = min(dp[x][j], dp[x][j - h] + e.second + dp[nxt][h]);
			}
		}
	}
}
  • 但是这样的循环显然是 \(O(n^3)\)
  • 这有一种固定的优化方法,可以将这三个循环优化到理论 \(O(n^2)\)

模板代码