AIDreamer
2017/5/30
树形DP就是状态之间的关系是树状结构的DP
【例题一】poj 2342 Anniversary party
题目大意
有一群人,每个人有一个欢乐值,这些人之间存在着一些上司和下属关系如A是B的上司,现在让你选出一些人满足这些人之间不存在直接的上司和下属关系并且使得总的欢乐值最大,问最大的欢乐值是多少。
分析
这种关系画出来是成树形的,节点代表一个人,节点上有一个值表示这个人的欢乐值,每个节点有两种状态:选或不选。这样我们的问题就转化成了:
在一颗点权树上选择一些节点满足任意两个节点不相邻使得被选节点的总权值最大并输出最大权值
我们可以通过观察发现:
1.如果某个节点不选,那么这个节点以下的分支可以单独作为一个新问题来求解
2.如果某个节点被选,那么这个节点的儿子一定不会选,那么这个节点的儿子们的分支可以作为一个新的问题来求解
这样就把问题不断地缩小直到能直接求解为止。
我们用 dp[i][1] 和 dp[i][0] 分别表示节点i不选和不选的情况下以节点i为根的树得到的最大值
那么有
{
dp[i][1]=∑j是i的儿子dp[j][0]