总结
最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的。
先说总的规律吧!
一般来说树形dp在设状态转移方程时都可以用f[i][]表示i这颗子树怎么怎么样的最优解,实现时一般都是用子树更新父亲(即从下向上更新),那么首先应该考虑的是一个一个子树的更新父亲还是把所有子树都算完了在更新父亲?这就要因题而异了,一般来说有两种情况:1.需要把所有子树的信息都掌握之后再更新子树的就需要把所有子树都算完了在更新父亲。2.而像树上背包这样的问题就需要一个一个的更新,每次都用一个子树更新已经更新完的子树+父亲,最后就可以将这一部分的子树更新完了,再继续往上更新,最后根节点就是答案。
其实上面的两种情况可以总结成一种情况就是一个个子树更新父亲,一般来说第一种情况应用更多,也能解决第二情况的问题,只不过如果符合第二种情况的时候用第二种可以速度更快一点,毕竟你省了一遍循环嘛。
在分题型说说说说树形dp的规律!
1.子树和计数。
这类问题主要是统计子树和,通过加减一些子树满足题目中要求的某些性质。
1.codeforces 767C Garland
这道题是让你把树分成3部分,使每部分点权和相等,这就是通过算子树的size[]实现的。
2.洛谷1122最大子树和
这道题让你剪去一些子树,让剩下的子树点权和最大。这题就要维护子树的点权和,f[i]表示i这颗子树的点权和最大值。
2.树上背包问题
这类问题就是让你求在树上选一些点满足价值最大的问题,一般都可以设f[i][j]表示i这颗子树选j个点的最优解。
1.洛谷1272重建道路
这道题是让你剪去最少的边实现最后剩P个点。所以P个点就是背包,剪去的边数就是价值。这题需要转化一下把剪边变成加边。
2.洛谷1273有线电视网
这道题是让你在保证不亏损的情况下满足更多的客户看到转播。此时用户的个数就是容量,f[i][j]表示i这颗子树选j个用户能赚的最多的钱。
3.花费最少的费用覆盖所有点
4.树上统计方案数问题
这类问题就是给你一个条件,问你有多少个点的集合满足这样的条件。这类题主要运用乘法原理,控制一个点不动,看他能做多少贡献。
1. 51nod1588幸运树。 问有多少个三元组满足幸运数字, 可以控制一个点不动,分成子树内,子树外两个部分,分别相乘就行了。可以看这个博客 。
与多种算法结合&&大模拟
1.洛谷3621 [APIO2007]风铃
把题目中的要求变成公式就行了。
2. 51nod1673树有几多愁
这道题是非常强的综合题,用到了虚树+状压dp+树形dp,具体的看这个博客吧。
3.51nod1531树上的博弈
非常强的一道博弈题。需要分情况的讨论,还是具体的看这个博客吧。
下面具体分析这几到例题。
1.codeforce 767C Garland
2.洛谷1122最大子树和
3.洛谷1272重建道路
4.洛谷1273有线电视网
5.洛谷2458 [SDOI2006]保安站岗
6.洛谷3621 [APIO2007]风铃
codeforce 767C Garland
Once at New Year Dima had a dream in which he was presented a fairy garland. A garland is a set of lamps, some pairs of which are connected by wires. Dima remembered that each two lamps in the garland were connected directly or indirectly via some wires. Furthermore, the number of wires was exactly one less than the number of lamps.
There was something unusual about the garland. Each lamp had its own brightness which depended on the temperature of the lamp. Temperatures could be positive, negative or zero. Dima has two friends, so he decided to share the garland with them. He wants to cut two different wires so that the garland breaks up into three parts. Each part of the garland should shine equally, i. e. the sums of lamps' temperatures should be equal in each of the parts. Of course, each of the parts should be non-empty, i. e. each part should contain at least one lamp.
Help Dima to find a suitable way to cut the garland, or determine that this is impossible.
While examining the garland, Dima lifted it up holding by one of the lamps. Thus, each of the lamps, except the one he is holding by, is now hanging on some wire. So, you should print two lamp ids as the answer which denote that Dima should cut the wires these lamps are hanging on. Of course, the lamp Dima is holding the garland by can't be included in the answer.
Input
The first line contains single integer n (3 ≤ n ≤ 106) — the number of lamps in the garland.
Then n lines follow. Thei-th of them contain the information about thei-th lamp: the number lampai, it is hanging on (and0, if is there is no such lamp), and its temperatureti ( - 100 ≤ ti ≤ 100). The lamps are numbered from1 ton.
Output
If there is no solution, print -1.