树形DP选讲

序言:为了巩固树形DP简单状态设计与转移特设此文

P1352 没有上司的舞会

做法:树形DP入门经典题,显然对于每个节点u有两种可能的情况一种为选一种为不选,且满足u与子节点v不能同时选故可设计出转移方程f[u][0/1]分别表示选或不选

f[u][1] += f[v][0]

f[u][0] += max(f[v][0],f[v][1]) 

P2014 [CTSC1997] 选课

做法:树上背包板子f[u][j]表示以u为根的子树内选j门课的最大方案

f[u][j] = max(f[u][j],f[u][j - k] +f[y][k])

P2015 二叉苹果树

做法:树上01背包,f[u][j]表示以u为根的子树保留j条边的最大方案

f[u][j] = max(f[u][j],f[u][j - k - 1] + f[y][k] + e[i].val)

P1613 跑路

做法:题目给出n十分小,故考虑用Floyd。按位转移f[k][u][v]表示u,v走2k能否,

h[u][v]表示两点能否到达

f[k][u][v] |= f[k - 1][u][w] & f[k -  1][w][v],h[u][v] |= f[k][u][v]

再将h跑一边floyd即可

P3478 [POI2008] STA-Station

做法:换根DP板子

P2986 [USACO10MAR] Great Cow Gathering G

做法:换根DP板子

P2016 战略游戏

做法:f[u][0/1]表示此节点放或不放的情况

f[u][0] += f[v][1]    f[u][1] = min(f[v][0],f[v][1])  

Choosing Capital for Treeland

做法:换根DP简单应用,题意为有向图,但其实可以将其翻转操作变为权值再进行DP,二次扫描即可

P1131 [ZJOI2007] 时态同步

做法:将题目转化为深度题即可

P4084 [USACO17DEC] Barn Painting G

做法:每种颜色分一类转移即可

P3047 [USACO12FEB] Nearby Cows G

做法:一眼换根,第二次扫描时注意回溯操作即可

Garland

做法:比较显然的树形DP,找根再DP时判断即可

[USACO08JAN] Cell Phone Network G

做法:较复杂的树形DP,显然可以设计出f[u][0/1/2]分别表示u节点自己染色/儿子染色/父亲染色,答案为min(f[1][1],f[1][0])

下面考虑转移

f[u][0] += min(f[v][0/1/2])

f[u][2] += min(f[v][0/1])

但f[u][1]较难转移因为只需有一个儿子染色即可,故假设每个v都染色

f[u][1] += f[v][0] g[++cnt] = f[v][1] - f[v][0]

给g排序如果g[i] < 0的话不选此儿子需要进行反悔操作

f[u][1] += g[i](注意枚举儿子最后一个不能也枚举)

P3174 [HAOI2009] 毛毛虫

Appleman and Tree

做法:设计f[u][0/1]表示以u为根的子树中恰好有一个黑点的方案数

f[u][1] = f[u][1] * (f[v][0] + f[v][1]) + f[u][0] * f[v][1]

f[u][0] = f[u][0] * (f[v][0] + f[v][1])

Tree Painting

做法:思考一下选定根节点后最大权值是否确定,显然是确定的。那么

f[u] = si[u] + f[v] g[1] = n + f[i](i∈E)

然后就是常规换根g[y] = g[x] + n - 2 * si[y]

P1453 城市环路

做法:基环树的题因为相邻两个点不能同时选故要判环,用并查集即可

用找出来的两个点来进行DP f[u][0] += max(f[v][1],f[v][0]) f[u][1] += f[v][0]

 

posted @ 2023-11-13 10:46  LouYW07  阅读(7)  评论(0)    收藏  举报