【BZOJ】4446: [Scoi2015]小凸玩密室 倍增+树形DP

本文介绍了BZOJ 4446题目的解法,这是一道结合了倍增技巧和树形动态规划的好题。关键在于利用完全二叉树的特性进行优化。通过枚举叶子节点转移到其祖先节点或祖先的兄弟节点的最少花费,构建动态规划状态转移方程,实现O(nlogn)的时间复杂度。
摘要由CSDN通过智能技术生成

传送门:bzoj4446


题解

倍增+DP好题。这道题的DP太神了!

感觉上这道题怎么DP向后的状态,或向前的状态都非常不好做,从Chen’s Blog学到了DP的新姿势

非常关键的一点:这是一颗完全二叉树。很多DP的优化方法都由此而来。

观察点灯的过程:

(1) 点亮一个点
(2) 选择其一个子节点递归下去,递归完毕则该子节点子树全部点亮(最后一个被点亮的必然是某个该子树内的叶子节点)
(3) 再递归另一子树
(4) 该子树已全部点亮,回溯其父节点
(5) 继续操作,直到整棵树都被点亮

由此过程受到启发:

  1. 无法有效枚举每一点是由其兄弟节点子树内哪个叶子转移而来
  2. 但可以枚举叶子转移到其某一级祖先的兄弟节点/或某一级祖先(注意这是一颗完全二叉树,层数是严格 logn log ⁡ n 的)的最少花费。
  3. 转移到某一级祖先的兄弟节点的情况表示过程(3),转移到某一级祖先的情况表示过程(4)

现在可以列出转移数组 f[i][j][0/1] f [ i ] [ j ] [ 0 / 1 ] 了,设 lci,rci l c i , r c i 分别表示节点 i i 的左右儿子,节点 i 的第 j j 个祖先为 f a [ i ] [ j ] (这里的第 j j 个祖先表示第 j 靠近该点的祖先),节点 i i 的第 j 个祖先的不为 i i 祖先的子节点( f [ i ] [ j 1 ] 的兄弟)为 li[i][j] l i [ i ] [ j ]

  • f[i][j][0] f [ i ] [ j ] [ 0 ] 表示以节点 i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值