当前位置:文档之家› 树形动规题型分析

树形动规题型分析

树形动规题型分析北京大学李煜东
Ural1039 没有上司的舞会
题目大意:Ural大学有N个职员,编号为1~N。

他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。

每个职员有一个快乐指数。

现在有个周年庆宴会,要求与会职员的快乐指数最大。

但是,没有职员愿和直接上司一起与会。

F[i][0]表示以i为根的子树,i不参加舞会时的最大快乐指数。

F i0=
s∈Son i
Max(F s0,F[s][1])
F[i][1]表示以i为根的子树,i参加舞会时的最大快乐指数。

F i1=Happy i+
s∈Son i
F s0
通过DFS求出F数组,目标就是Max(F[1][0],F[1][1])。

Nescafé8 创世纪
题目大意:上帝手中有着N(N<=1000000)种被称作“世界元素”的东西,现在他要把它们中的一部分投放到一个新的空间中去建造世界。

每种世界元素都可以限制另外一种世界元素,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素能够限制它。

上帝希望知道他最多可以投放多少种世界元素?
每个世界元素的出度都是1(只能限制另外一种),所以题目中的限制条件构成内向树森林。

如果题目中的限制条件构成的图是一棵树,那么DP方法和上一题类似:F[i][0]表示i没有被投放时,以i为根的子树里最多可以投放多少种世界元素。

F[i][1]表示i被投放时,以i为根的子树里最多可以投放多少种世界元素。

F i0=s∈Son i Max(F s0,F[s][1])
F i1=Max F s0+s′∈Son i,s′≠s Max F s′0,F s′1|s∈Son i
如果是内向树,那么任意枚举基环上的一条边,先把它断开(不使用这个限制条件),在剩余的树上进行树状动规;然后再强制使用这个限制条件,再进行一次树状动规。

TYVJ1051 选课(背包转移)
题目大意:有N门课程,每门课有各自的学分。

每门课程至多有一门先修课,如果要选择这门课程,必须同时选择它的先修课。

现在从中选择M门课,问最多可以获得多少学分?
F[i][j]表示以i为根的子树中选了j门课程可以获得的最多学分。

F i j=Max s∈Son(i)F s k s|s∈Son i k s=j−1+Point[i]
如果我们把j看做总体积,i的每个孩子s看做一组物品,这组物品的体积为k s(0<k s<j),价值为F s k s0<k s<j,那么这个转移其实就是一个分组01背包问题。

F i[0]=0
for s∈Son i
for j=m→0
for k=j−1→0
F i[j]=Max(F i j,F i j−k−1+F s k)
for j=m→1F i j+=Point[i]
POJ2486 Apple Tree(左儿子右兄弟)
题目大意:一个叫Wshxzt的可爱的女孩子被HX大叔带到了一棵苹果树边。

众所周知,苹果树是一个树形的结构,在节点处长有苹果(这明显不符合实际情况……)。

现在我们知道Wshxzt是个苹果控,她只要访问到一个节点,就一定会吃光这个节点所有的苹果。

当然一个节点的苹果只能吃一次。

HX大叔为了防止Wshxzt长胖,限制她只能走K(1 ≤ K ≤ 200)步,从一个节点走到另一个相邻的节点是所谓走一步。

Wshxzt从节点1开始。

树上的节点有N(1 ≤ N ≤ 100)个,你需要计算Wshxzt最多能吃到多少苹果。

先构造树结构,把树转为左儿子右兄弟的二叉树。

设f[i,k,0]表示从i节点往下一共走了k步,不再回到i节点的最大苹果数。

f[i,k,1]表示走k 步回到i节点。

本文用temp代表0或1。

状态转移分以下几种:
POJ2486 Apple Tree(左儿子右兄弟)
访问完i后只访问儿子节点L。

f[i,k,0]=f[l,k-1,0]; f[i,k,1]=f[i,k-2,1];
不回来的话这条边走一次,那么子节点还可以走k-1步。

回来的话当然这条边走两次,子节点只能走k-2步。

访问完i后只访问兄弟节点R。

f[i,k,temp]=f[r,k-2,temp];
既访问子节点,又访问兄弟节点。

又分为temp=1和temp=0。

temp=1时,max(dp(l,j,1)+dp(r,k-4-j,1));(0<=j<=k-4)。

temp=0又分为:
【去兄弟节点,回来,再去孩子节点,不回来,max(dp(l,j,0)+dp(r,k-3-j,1)】【去孩子节点,回来,再去兄弟节点,不回来,max(dp(l,j,1)+dp(r,k-4-j,0))】 不访问i节点,直接奔向他的兄弟节点。

注意k=0时也可以直接去兄弟节点!
POJ2152 Fire
题目大意:Z国有n个城市,从1到n给这些城市编号。

城市之间连着高速公路,并且每两个城市之间有且只有一条通路。

不同的高速公路可能有不同的长度。

最近Z国经常发生火灾,所以当地政府决定在某些城市修建一些消防站。

在城市k修建一个消防站须要花费大小为W的费用。

函数W对于不同的城市可能有不同的取值。

如果在城市k没有消防站,那么它到离它最近的消防站的距离不能超过D。

每个城市在不超过距离D的前提下,必须选择最近的消防站作为负责站。

函数D对于不同的城市可能有不同的取值。

为了节省钱,当地政府希望你用最少的总费用修建一些消防站,并且使得这些消防站满足上述的要求。

POJ2152 Fire
设F[i]表示以i为根节点的子树被消防站管辖所需的最小代价;
D[i,j]表示i节点必须被j节点上建立的消防站管辖时,i这棵子树所花的最小代价;
Dis[i,j]表示点i到点j的距离,A和B数组分别为题目读入的W和D。

D[i,j]=+∞ ——当且仅当Dis[i,j]>B[i]
D[i,j]=A[j]+∑Min{D[k,j]-A[j] ,F[k] } ——当且仅当Dis[i,j]<=B[i],并且k是i 的直接子节点。

F[i]=Min{D[i,j]} (1<=j<=n)
目标为根节点的F值。

第一个方程,表示j离得太远不能管辖i。

第二个方程,D[i,j]表示在j节点建立消防站管理i,那么首先需要花费A[j]来建立;如果i的子节点k及其子树不用j来管辖,就是F[k];如果k也用j来管辖,那么再计算F[k]就会重复累加A[j],所以此时转移D[k,j]-A[j]。

相关主题