板子汇总篇–树形DP
汇总总览 板子汇总
树形dp
树的特点:没有环
因此每一个节点都可以被当作根节点
思路:
通过一个节点去作为母节点遍历所有点,通过合理的转换图构建状态转换方程
const int N = 2010;
int n;
vector a[N];
int w[N];
int f[N]; // dp[N];
dfs
void dfs(int u, int fa) {
f[u][2] = w[u];
for(auto A : a[u]) {
if(A == fa) continue;
dfs(A, u);
// 状态转换方程
}
}
build
for(int i = 1; i <= n; i++) {
int x, y, z; // 点 点 权值
cin >> x >> y;
// cin >> z;
/* 无权值 */
a[x].push_back(y);
a[y].push_back(x);
/* 有权值 */
a[x].push_back({y, z});
a[y].push_back({x, z});
}
传送门:
树形DP:
换根DP:树的中心
树形DP(点观察边):战略游戏
树形DP(边观察点):皇宫看守