树形动态规划

树形动态规划是在属性结构上实现的动态规划,也称树形DP。动态规划自身是多阶段决策问题,而树形结构有明显的层次性,正好对应动态规划的多个阶段。树形结构有明显的层次性,正好对应动态规划的多个阶段。树形DP的求解过程一般为自底向上,将子树从小到大作为DP的“阶段”,将节点编号作为DP状态的第1维,代表以该节点为根的子树。树形DP一般采用深度优先遍历的方法,递归求解每颗子树,回溯时从子节点向上进行状态转移。在当前节点的所有子树都求解完毕后,才可以求解当前节点。

树形动态规划-01.png

树形DP有两种(大部分情况不可以相互转化):

  • 根到叶子:不过这种动态规划在实际的问题中运用的不多。
  • 叶子到根:根的子节点传递有用的信息给根,完后根得出最优解的过程。

叶子到根节点

  1. 二叉树灯饰

每个节点上均有一盏灯和三个开关。节点值为 0 表示灯处于「关闭」状态,节点值为 1 表示灯处于「开启」状态。每个节点上的三个开关各自功能如下:

  • 开关 1:切换当前节点的灯的状态;
  • 开关 2:切换以当前节点为根的子树中,所有节点上的灯的状态;
  • 开关 3:切换当前节点及其左右子节点(若存在的话)上的灯的状态;

需要找到最少的开关更新次数。

求解过程:用长度为2的二进制数来表示树的状态,低位表示根节点,高位表示除根以外的节点,其中00为全关,01为根节点开、其他全关,10为根节点关、其他全开,11为全开。用长度为3的二进制数来表示操作状态,从低位到高位分别表示操作1、2、3,一共8种状态。其执行操作后转移的条件为左右子树同时满足全开或者全关。

使用二进制进行状态压缩的好处是切换开关状态只需要使用异或。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,403评论 0 2
  • 问题描述有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被...
    CatherYan阅读 4,722评论 1 0
  • 0x50「动态规划」例题 区间DP 线性DP从初态开始,沿着“阶段”向某个方向扩张。而区间DP是线性DP的一种,它...
    云中翻月阅读 3,890评论 0 1
  • to update,还没有排版,lyd的这个部分还没看完 适用范围a) 很多意想不到的问题可以用动态规划做b) ...
    Loboqui阅读 1,950评论 0 1
  • 动态规划 通过子问题递推求解最优的方法, 动态规划常常适用于有重叠子问题和最优子结构性质的问题 。 解题思路 动态...
    GeorgeDon阅读 1,198评论 0 0

友情链接更多精彩内容