树形Dp入门与例题

版权声明:欢迎转载ヽ(•ω•ゞ)···如有表意不清或您没有看懂评论即可! https://blog.csdn.net/yandaoqiusheng/article/details/84947117

树形dp
顾名思义
在树上dp
有人就说了
普通的dp都不会还让我在树上dp!!
可是
一般的树形dp没有别的dp水那么深
当然了
除了一些毒瘤题之外

树形dp一般是从下往上
也就是从叶节点到根节点
按这个顺序更新信息
因为叶节点的信息可以初始化
当然也会有从根节点向叶节点更新的
碰到这种题目再说

树形dp和递归分不开
这就需要掌握dfs的精髓
不大懂的话找个代码开调试看下它怎么跑的就好了
我个人一般建无向图
dfs的时候记录下前驱就好
有向图也没有关系
因为一般是从下往上遍历的

至于树形背包
树形背包==分组背包
做题多了见过的模型多了就看得出来了
下面的选课比较经典,入门题

例题

Luogu 1352 没有上司的舞会
HDU 1520 Anniversary party
这两个是一道题着
只是下面那个多组数据
题目中还没说清楚
好坑我

这是最基础的一类树形dp
选了父亲节点就不能选儿子节点
也就是相邻的两个点不能同时选
方程很简单

f [ f r ] [ 0 ] + = m a x ( f [ c a ] [ 0 ] , f [ c a ] [ 1 ] ) f[fr][0]+=max(f[ca][0],f[ca][1])
f [ f r ] [ 1 ] + = f [ c a ] [ 0 ] f[fr][1]+=f[ca][0]
f r fr 为当前节点, c a ca 为遍历到的节点

第一个方程就是儿子选不选都可以
第二个方程是儿子不能选,因为当前节点已经选了

进阶版

Luogu 2607 骑士
这题在上一个方程的基础上加了点东西
基环树与删边
当然主要是拼脑子
具体来这看,挺详细的了——点这里

换换类型

Luogu 2014 选课
每个节点只有在选了它的父节点之后才能选
题解——点这里
Luogu 2015 二叉苹果树
要删去 k k 条边,要使剩下的节点权值最大
题解——点这里

Luogu 1273 有线电视网
题面好难说啊自己看去吧( • ̀ω•́ )✧
题解——点这里

最小点覆盖问题

每个点能覆盖附近的两条边,用最少的点把这张图覆盖起来
Luogu 2016 战略游戏
诶,
这个好像才是入门的
麻烦不改了
如果当前节点不放置士兵,那么它的子节点必须全部放置士兵
如果当前节点放置士兵,它的子节点选不选就无所谓了

f [ f r ] [ 0 ] + = f [ c a ] [ 1 ] f[fr][0]+=f[ca][1] //当前节点不放
f [ f r ] [ 1 ] + = m i n ( f [ c a ] [ 0 ] , f [ c a ] [ 1 ] ) f[fr][1]+=min(f[ca][0],f[ca][1]) //放

和第一种类型是不是有点像
双倍经验

CF 767C Garland(洛谷)
给出一颗树,问能否删除两条边使这三部分的点权和相等
题解——点这里

HDU 2196 Computer
求树上每个点能走的最长路
HDU 4514 湫湫系列故事——设计风景线
这俩题基本一样
第一个题解——点这里
第二个题解——点这里

先这样
有东西再更( ̄▽ ̄)/

猜你喜欢

转载自blog.csdn.net/yandaoqiusheng/article/details/84947117