题目链接
传送门
题意
两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次经过,直到无法移动则结束游戏,两人都想最大化自己的权值和减对手权值和,问先手减后手权值和最大是多少。
思路
换根\(DP\),和求树的直径有点类似。
\(dp[i][j]\)表示在\(i\)这个结点状态为\(j\)时先手权值和减后手权值和最优是多少,\(j\)为偶数表示当前是先手,为奇数时为后手。
转移方程:我们该\(dp\)是倒着推的,也就是说从游戏结束开始往游戏开始推,假设当前是先手选择,那么下一步就是后手移动,按照题目要求后手一定是想最小化先手减后手权值和,因此当前一定是从最小的先手减后手权值和转移过来;如果当前是后手那么就从先手减后手权值和最大转移过来。
需要特别注意的两点是:
-
从子结点转移过来很好想,就是子结点中相反状态转移过来,也就是当前为先手那么从最小过来;从父亲结点转移过来的时候,因为一个结点只有一个父亲结点,因此如果当前是先手,那么父亲结点也就确定了,因此它要从父亲结点从其他结点转移过来的最大值转移到当前结点,后手同理,枚举起点时由于你枚举之后起点也固定了,因此对于同一个起点要选择值最小的方向(因为这里我卡了好久,好菜啊)。
-
最后枚举答案的时候如果当前点是叶子结点,那么它的答案是从父亲结点贡献的,不能由它自己贡献,因为如果先手选择这个点为起点,那么后手一定是往父亲结点选。
代码
#include
#include