树型动态规划练习总结

类型一、多叉树转二叉树进行资源分配

例如:

* 例1. 选课:每门课可能有一门先选课,即某些课必须在另外的某节课被选之后才能选,每门课能得的学分不同,求最大学分。

* 例2. 通向自由的钥匙:可以从一个房间通向另外多个房间,通过每个房间所需的花费不同,得到的价值也不同,用最小花费获得最大价值。

这种题目的特点是需要在多叉树上进行资源的分配,对不同的子树分配不同的资源,以求最大价值。可以直接在多叉树上用背包的方式求解,但是更常用的方法是用左孩子右兄弟表示法转化为二叉树。

转化之后的通用状态转移方程:

用 f(i,j) 表示将总量为 j 的资源分配给以 i 为根节点的子树,则

f(i, j) = max{ f(i.left, k) + f(i.right, j-cost(i)-k) + value(i), f(i.right, j) },其中 k∈(0, j-cost(i))

解释一下上面的方程。对于每个节点 i 都有两种决策:

1. 在节点 i 消耗资源并获得相应价值,然后在节点 i 的子节点和兄弟节点中进行决策;

2. 忽略节点 i ,在 i 的兄弟节点(i.right)中进行决策。

以上两道例题的状态转移方程写法都与这种通用写法类似。

类型二、一个节点的不同状态

(这种类型不知道怎么叫)

例如:

* 例1. 警卫安排:在一个节点上安排警卫可以保证与其相邻的节点的安全,每个节点安排警卫的代价不同,在一棵树上用最小代价保证整棵树的安全。

* 例2. 没有上司的晚会:职员和他的直接上司不会同时出现在晚会,每个职员在晚会上的快乐程度不同,求晚会的最大快乐程度。

这种题目的特点是每个节点有各自不同的状态,如警卫安排中每个节点有三种状态:1. 自己设有警卫;2. 父节点设有警卫;3. 子节点设有警卫。例2中每个节点(职员)有两种状态:1. 参加;2. 不参加。

对每个节点的每个状态进行转移即可。

如例2:

用 f(i, 0) 表示 i 不参加晚会,用 f(i, 1) 表示 i 参加晚会,则

f(i, 0) = sum{ max{ f(j, 0), f(j, 1) } }

f(i, 1) = sum{ max{ f(j, 0) } }

(j 是 i 的子节点)

解释一下上面的两个方程:

当 i 参加晚会时,i 的下属必然不参加晚会;

当 i 不参加晚会时,i 的下属可以参加晚会也可以不参加晚会。

例1类似。

类型三、二叉树上的资源分配

是类型一的简化版,题目的模型即二叉树,不用进行转换就可以直接求解。

树型动态规划练习总结

时间: 2024-10-11 21:19:00

树型动态规划练习总结的相关文章

蓝桥杯 节点选择 树状动态规划

算法训练 结点选择 时间限制:1.0s   内存限制:256.0MB 锦囊1 使用树型动态规划. 锦囊2 用F[i]表示从子树i中选择结点,且结点i必须被选择的最大值,用G[i]表示从子树i中选择结点,且结点i必须不被选择的最大值. 则F[i]=a[i]+\sum(G[j]),其中a[i]表示结点i的权值,j是i的子结点. G[i]=\sum(max(F[j], G[j])),其中j是i的子结点. 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和

oracle使用connect by进行级联查询 树型菜单

Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关系的,最顶级的菜单对应的parent_id为0.现假设我们拥有如下记录: id name parent_id 1 菜单01 0 2 菜单02 0 3 菜单03 0 4 菜单0101 1 5 菜单0102

HDU1561 The more, The Better(树型DP)

题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过各自分配若干的城堡去攻克转移的,一个排列组合数,阶乘,是指数级的时间复杂度! 看了题解,原来这是依赖背包,没看背包九讲..不过网上的博客似乎没说清楚,事实上这个状态应该是三个维度来表示: dp[u][

POJ3659 Cell Phone Network(树上最小支配集:树型DP)

题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. 树上的每个结点作为其子树的根可以有三个状态: 不属于支配集且还没被支配 不属于支配集但被其孩子支配 属于支配集 那么就是用dp[u][1\2\3]来表示动归的状态. 123转移该怎么转移就怎么转移..最后的结果就是min(dp[root][2],dp[root][3]). 要注意的是对于有些结点前2

网格部件和树型部件查找并定位焦点

在网格和树型部件中,经常遇到需要根据某字段值或关键值查找网格或树型中的某一行数据并定位焦点,如何实现这样的功能呢?1.网格部件查找定位:在网格部件中,我们可以根据显示数据的行数,进行循环,获取值与查找值进行对比,代码如下: for i=1 to 网格部件1.GridView.RowCount      if cstr(网格部件1.GetFieldValueByRowHandle(i-1,"姓名"))="张三" then        网格部件1.FocusedRow

php通用的树型类创建无限级树型菜单

生成树型结构所需要的2维数组,var $arr = array()数组格式如下: array( 1 => array('id'=>'1','parentID'=>0,'name'=>'一级栏目一'), 2 => array('id'=>'2','parentID'=>0,'name'=>'一级栏目二'), 3 => array('id'=>'3','parentID'=>1,'name'=>'二级栏目一'), 4 => arra

HDU_1561_The more, The Better_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7031    Accepted Submission(s): 4121 Problem Description ACboy很喜欢玩一种战略游戏,

HDU_1520_Anniversary party_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8233    Accepted Submission(s): 3574 Problem Description There is going to b

树型结构

树型结构的基本概念 对大量的输入数据,链表的线性访问时间太慢,不宜使用.本文探讨另外一种重要的数据结构----树,其大部分时间可以保证操作的运行平均时间复杂度为O(logN),第一部分先来看一下树的一些预备知识. 首先看一下树形结构的样子,下图代表的是树型结构的一般形态: 由上图看得出树是一些节点的集合,总结一下树的一些基本概念: 1.结点:树中的数据元素都称之为结点 2.根:最上面的结点称之为根,一颗树只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的根 3.父亲:结点