一些另类的树形背包 DP 总结 ——从两道例题剖析树形背包 DP 解法

一些另类的树形背包 DP 总结

——从两道例题剖析树形背包 DP 解法


总结题目


简介

两道题目都有用到树形背包 DP,但是其状态与转移并不尽相同,其中,我们逐题分析。


分析

P4629 [SHOI2015] 聚变反应炉

该题目是一道数据分治题,树形最值类背包 DP 用于后 \(50\%\) 的 10 个测试点。

状态设置

在读完题意后,我们发现答案是由操作顺序决定的,而在一棵树上,最终直接影响到的无非相邻节点,即父子节点,说明我们应该特别注意这一点并将它拎出来作为状态的一个要点。

那么我们发现状态的要点有一下三点:目前子树根节点、目前节点与父节点的先后操作顺序、最少花费。

可以设定出我们最终的状态:\(f_{u,0/1}\) 表示目前子树根节点为 \(u\),是、否先与父节点操作的最少花费(整棵子树都已完成操作)。

转移设置

树形背包 DP 的转移非常套路:从子节点往父节点合并或从父节点往子节点复制再反馈回来。这题也是一样,选择前者,只不过还需要在开一个 DP 数组进行辅助转移:\(h_{i}\) 表示目前子树根节点为 \(u\),已经接受了子节点 \(i\) 的能量的最小花费。

合并转移的过程:(\(h'\) 表示更新过后的 \(h\)

\[h'_{i} = \min{ \{ h_{i-c_v} + f_{v,0} , h_{i} + f_{v,1} \} } \]

合并完所有子树最后再转移到 \(f\) 中:

\[f_{u,0} = \min{\{ \max{(h_i,h_i-i+d_u)} \}}, f_{u,1} = \min{\{ \max{(h_i,h_i-i+d_u-c_{fa})} \}} \]

答案查询

答案就是 \(f_{root,0}\)

P4516 [JSOI2018] 潜入行动

一道显然的树形计数类背包 DP。

状态设置

题目非常明确地为我们指出了几个状态要素:监听设备的数量、方案数。再加上其树形 DP 的本质,目前子树根节点也是一个必不可少的要素。

那么题目还有一个要求:所有节点的通信都被监听,我们很容易就可以得出影响父节点结果的还有:目前子树根节点是否被(子节点)监听、目前子树根节点是否有监听器。

列出要素:目前子树根节点、监听设备的数量、方案数、目前子树根节点是否被(子节点)监听、目前子树根节点是否有监听器。

那么得出状态:\(f_{u,i,0/1,0/1}\) 表示目前子树根节点为 \(u\), 已经用了 \(i\) 个监听器,\(u\) 是、否有监听器,\(u\) 是、否被(子节点)监听时的总方案数。

转移设置

依旧是依照套路:从子节点往父节点合并。

这一题的状态转移并不难,只是略微繁杂,转移式如下:(\(f’\) 表示更新过后的 \(f\)

\[\begin{aligned} f'_{u,i+j,0,0} & = \sum f_{u,i,0,0} \times f_{v,j,0,1} \\ f'_{u,i+j,1,0} & = \sum f_{u,i,1,0} \times (f_{v,j,0,0}+f_{v,j,0,1}) \\ f'_{u,i+j,0,1} & = \sum [f_{u,i,0,1} \times (f_{v,j,0,1}+f_{v,j,1,1}) + f_{u,i,0,0} \times f'_{v,j,1,1}] \\ f'_{u,i+j,1,1} & = \sum [f_{u,i,1,1} \times (f_{v,j,0,0}+f_{v,j,0,1}+f_{v,j,1,0}+f_{v,j,1,1}) + f_{u,i,1,0} \times (f_{v,j,1,0}+f_{v,j,1,1})] \\ \end{aligned} \]

直接暴力转移为 \(O(n^2k)\),加入上下界优化即可降到 \(O(nk)\)

答案查询

答案就是 \(f_{root,k,0,1}+f_{root,k,1,1}\)


总结

在做类似的树形背包 DP 时,要优先考虑树形背包 DP 的惯例转移、DP 套路与题目性质相结合。


posted @ 2024-07-09 13:22  Add_Catalyst  阅读(16)  评论(0)    收藏  举报