给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
首先看题意,有DP的重复子问题和最优子结构的特点,考虑使用树形DP。
决定了用DP,接下来就需要找到状态。可能存在的误区是去讨论当前节点父节点或子节点的状态来决定当前节点状态,因而陷入混乱,但动态规划应该专注于当前问题新增的状态,在这里即仅关注当前节点。
阅读题干,可以抽象出一个节点的状态包含两方面:是否放置了监控器,是否被监控覆盖。但是只要节点放置了监控,也就会被覆盖,可以压缩掉一个状态,所以最终的状态有三种:
- 节点已放置监控
- 节点未放置监控,但自身已被覆盖
- 节点未放置监控,且自身未被覆盖
注意:这些状态的前提是假定子树均已被覆盖。
那么,DP状态可表示为DP[node][state],表示当前节点在该状态下所需的最小监控数量。
第一维度可以在遍历树的递归中体现,第二维度则需要将值自下而上传递给根节点,故放入递归方法的返回值。最终递归方法可定义为:int[] recursion(TreeNode node)
确定状态后,分析状态转