迷宫

其实他这个DP状态解释的有一点问题,终点不一定非要是\(i\)

其实就是在\(i\)的子树中找一条链,满足\(i\)是一个端点,然后另一个端点是否有陷阱(行进方向到时候再具体讨论,除了一些特殊状态,\(i\)为起点或终点都是可以的);然后一定要注意,这个状态是从起点到终点经过\(j\)个陷阱的最优值,也就是说,走到终点之后完全有可能再继续延长这条路径,但是走到终点时,累积经过的陷阱数就是\(j\)

于是就可以好好理解上面的转移过程了;然后最开始的初始化过程指的是起点终点都是根的情况,所以要这么初始化(从下面的main函数来看,dp数组是被初始化为负无穷的,负无穷代表不合法状态)

这个更新答案的过程感觉没必要这么复杂,不太好理解,感觉讨论一条链的陷阱个数\(j\),然后另一条链的陷阱个数就是\(C-j\)了,然后讨论一下方向是否正确

注意这个代码用了树形DP求树的直径的类似的做法

update 2024.6.29

这里当然可以用换根DP,然而,我们也可以记一下,这里由于是一条链,在某一颗以\(x\)为根的子树中,链的情况无非就两种,一种是以\(x\)为起点,另一种就是以\(x\)为转折点,而这两种情况都可以转化为以\(x\)为根的树形DP,所以链的情况就可以不用树形DP了

为什么最开始枚举每个节点都是根节点的时候,可以不用设第三维呢?这就是因为如果枚举每个根节点的话,当前被枚举的这个根节点一定是起点,也就不会导致答案的丢失。比如说一条路径一个端点没有陷阱另一个端点有陷阱,但是只允许经过一个陷阱,那么显然起点只能是哪个没有陷阱的端点,然而如果我们指定了有陷阱的端点是根节点的话,显然这条路径(如果我们的状态不开第三维)就不会被枚举到了,这就要求我们再指定没有陷阱的端点为根节点,然后再做一次DP来覆盖这个答案

posted @ 2024-01-26 23:45  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报