博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
阅读量:6615 次
发布时间:2019-06-24

本文共 968 字,大约阅读时间需要 3 分钟。

根据最近做的几道树形dp题总结一下规律。(从这篇往前到洛谷 P1352 )

这几道题都是在一颗树上,然后要让整棵树的节点或边
满足一种状态。然后点可以影响到相邻点的这种状态
然后求最小次数

那么要从两个维度来设计状态

第一个维度
(1)以i为根的树的所有节点都满足这种状态
(2)以i为根的树的只有i不满足这种状态
第二个维度
(1)i这个点取
(2)i这个点不取

所以就会有四种状态,不过最近几道题都是直接pass掉了其中一种

只有三种状态。
状态设计好了就很好写转移方程了,记住转移的过程中孩子一定
要都满足状态,这样做下来才可以使得整棵树满足状态。


然后我们把这个模型套到这道题

第一个维度
亮表示以i为根的子树全部节点都亮
不亮表示以i为根的子树只有i不亮
第二个维度
i这个灯泡开或者不开
所以状态是

(1)f[i][0] 没开,亮

(2)f[i][1] 没开,没亮
(3)f[i][2] 开,亮
(4)f[i][3] 开,没亮

这里f[i][3]pass掉,因为你要把没亮变成亮需要根节点按按钮,

此时跟节点消耗一个操作,而孩子自己又消耗一个操作
如果是开,亮的话只用消耗孩子一个操作。

现在写状态转移方程

u表示根节点,v表示孩子
f[u][2] = sum(f[v][1])
这时跟节点一开就都亮了(f[u][2]一开始会初始化为1)

f[u][0] = sum(min(f[v][0], f[v][2]))

f[u][1] = sum(min(f[v][0], f[v][2]))

这里有个奇偶数的问题,令sum = sum(min(f[v][0], f[v][2]))

不仅要算出sum

然后还要算出以最小花费把其中一个min换成另外一个操作的值,即sum + mint
假设f[v][2]是奇数,意味着当前是亮的,所以f[u][1] = sum + mint,f[u][0] = sum   
如果是偶数,就反过来,f[u][1] = sum,f[u][0] = sum + mint 

这里有小细节,到叶子结点的时候,f[u][0]是不可能的(不考虑父亲)

那么这时按照程序f[u][0]会等于无穷大,所以相当于不可能
 

转载于:https://www.cnblogs.com/sugewud/p/9819391.html

你可能感兴趣的文章
Amazon RDS的通用型存储(SSD)
查看>>
发现并防止托管代码中出现内存泄漏
查看>>
Redis+TwemProxy(nutcracker)集群方案部署记录
查看>>
相等与全等
查看>>
VS无法设置断点的解决方案
查看>>
Android -- 再来一发Notification
查看>>
从尾到头打印链表
查看>>
android 开发之电子钢琴 源码
查看>>
Java的jar文件安装成windows 服务
查看>>
MapGuide中怎么实现“指哪儿打哪儿”?ToolTip帮你忙~
查看>>
GridView添加统计(合计)行
查看>>
第3部分。XAML标记扩展
查看>>
Linux 定时运行脚本、命令
查看>>
如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
查看>>
php mysqli mysqli_query() mysqli_real_query()
查看>>
开源欣赏wordpress之用户新增user-new.php
查看>>
管理Mysql常用指令
查看>>
jQuery 2.0.3 源码分析 数据缓存
查看>>
nginx访问报错:Too many open files accept:
查看>>
NSPredicate,谓词
查看>>