一、树形DP存树 how to build a tree!
1.用vector,动态数组存图,储存两个节点的父子关系(接下来的代码使用这个)
2、链式前向星
3、邻接表
二、怎样动态规划 how to DP!
给定一棵有n个节点的树,我们可以任选一个点为根节点,从而
定义出每个节点的深度和每棵子树的根
在树上进行DP,一般就以节点从深到浅的顺序作为DP的“阶段”。
DP的状态表示中,第一维通常是节点编号(代表以该节点为根的子树)。
大多数时候,采用递归的方式实现树形DP。
对于每个节点x,先递归在它的每个子结点上进行DP,在回溯时,从子节点向节点x进行转移
普通dp比较常用的考虑方法是dp[i][0/1]表示点i选/不选的情况下,其子树的最优情况;
如果是树形背包,那么dp[i][j]表示在以点i为根节点的子树中,选择j个点的最优情况。
三、例题: do the title!
(一)、没有上司的舞会
(题目略)
设dp[x][0]表示从x为根的子树中邀请一部分职员参会,而x自己不去,快乐指数的最大值。
此时,x的子结点去不去随便,于是有:
设dp[x][1]表示从x为根的子树中邀请一部分职员参会,x自己去,快乐指数的最大值。
此时,x的子结点都甭去
son(x)表示x的子结点集合
本题输入的是一根有根树,所以我们要先找到root,然后DP的目标