一些另类的树形背包 DP 总结 ——从两道例题剖析树形背包 DP 解法
一些另类的树形背包 DP 总结
——从两道例题剖析树形背包 DP 解法
总结题目
简介
两道题目都有用到树形背包 DP,但是其状态与转移并不尽相同,其中,我们逐题分析。
分析
P4629 [SHOI2015] 聚变反应炉
该题目是一道数据分治题,树形最值类背包 DP 用于后 \(50\%\) 的 10 个测试点。
状态设置
在读完题意后,我们发现答案是由操作顺序决定的,而在一棵树上,最终直接影响到的无非相邻节点,即父子节点,说明我们应该特别注意这一点并将它拎出来作为状态的一个要点。
那么我们发现状态的要点有一下三点:目前子树根节点、目前节点与父节点的先后操作顺序、最少花费。
可以设定出我们最终的状态:\(f_{u,0/1}\) 表示目前子树根节点为 \(u\),是、否先与父节点操作的最少花费(整棵子树都已完成操作)。
转移设置
树形背包 DP 的转移非常套路:从子节点往父节点合并或从父节点往子节点复制再反馈回来。这题也是一样,选择前者,只不过还需要在开一个 DP 数组进行辅助转移:\(h_{i}\) 表示目前子树根节点为 \(u\),已经接受了子节点 \(i\) 的能量的最小花费。
合并转移的过程:(\(h'\) 表示更新过后的 \(h\))
合并完所有子树最后再转移到 \(f\) 中:
答案查询
答案就是 \(f_{root,0}\)。
P4516 [JSOI2018] 潜入行动
一道显然的树形计数类背包 DP。
状态设置
题目非常明确地为我们指出了几个状态要素:监听设备的数量、方案数。再加上其树形 DP 的本质,目前子树根节点也是一个必不可少的要素。
那么题目还有一个要求:所有节点的通信都被监听,我们很容易就可以得出影响父节点结果的还有:目前子树根节点是否被(子节点)监听、目前子树根节点是否有监听器。
列出要素:目前子树根节点、监听设备的数量、方案数、目前子树根节点是否被(子节点)监听、目前子树根节点是否有监听器。
那么得出状态:\(f_{u,i,0/1,0/1}\) 表示目前子树根节点为 \(u\), 已经用了 \(i\) 个监听器,\(u\) 是、否有监听器,\(u\) 是、否被(子节点)监听时的总方案数。
转移设置
依旧是依照套路:从子节点往父节点合并。
这一题的状态转移并不难,只是略微繁杂,转移式如下:(\(f’\) 表示更新过后的 \(f\))
直接暴力转移为 \(O(n^2k)\),加入上下界优化即可降到 \(O(nk)\)。
答案查询
答案就是 \(f_{root,k,0,1}+f_{root,k,1,1}\)。
总结
在做类似的树形背包 DP 时,要优先考虑树形背包 DP 的惯例转移、DP 套路与题目性质相结合。

浙公网安备 33010602011771号