树形DP

高级

树形 DP 是 CSP-S 高频考点,核心是"子树信息合并"。

树形DP

演示树形DP求解树上最大独立集的过程。

AlgoAnim · 树形DP

待机

速度
待机
// 源代码
1int dp[100001][2];
2
3void dfs(int u, vector<vector<int>>& adj, vector<int>& val) {
4    dp[u][0] = 0;
5    dp[u][1] = val[u];
6    for (int v : adj[u]) {
7        dfs(v, adj, val);
8        dp[u][0] += max(dp[v][0], dp[v][1]);
9        dp[u][1] += dp[v][0];
10    }
11}

复杂度分析

时间 O(n)
空间 O(n)
最优 O(n)
最坏 O(n)

算法讲解

树形 DP 在树上定义 DP 状态,通常以子树为单位进行转移。

经典问题:树的最大独立集、树的直径、树上最长路径。

实现方式:后序遍历(DFS),先处理子树再合并到父节点。

时间复杂度 O(n),空间复杂度 O(n)。