P3959 [NOIP2017 提高组] 宝藏 题解

一道状压 DP 题。

发现这道题 n ≤ 12 n \leq 12 n12 其实特别小,因此可以考虑状压,而且可以直接邻接矩阵存图。

首先我们发现这道题打通的路径构成的图一定是棵树,而根节点就是起点,因此我们需要知道每一个点距离根节点的距离,也就是深度 d e p dep dep,根节点深度为 0。

f i , j , d f_{i,j,d} fi,j,d 表示当前被挖到的最新的点是 i i i,已经连通的点的点集为 j j j(状压为 2 12 − 1 2^{12}-1 2121),目前已经挖了 d d d 个点的最小花费。

于是我们有以下转移方程:

f v , j , d + 1 = min ⁡ { f u , j ∣ ( 1 < < ( v − 1 ) ) , d + ( d e p u + 1 ) × e u , v ∣ u → v } f_{v,j,d+1}=\min\{f_{u,j|(1<<(v-1)),d}+(dep_u+1) \times e_{u,v}|u \to v\} fv,j,d+1=min{fu,j(1<<(v1)),d+(depu+1)×eu,vuv}

其中 e u , v e_{u,v} eu,v ( u , v ) (u,v) (u,v) 的边权。

上述转移方程的意义就是我们从所有可达的未选取的点中选取一个,然后进行转移。

发现这个转移方程写成 DFS 的方式会更加合适,因为 DFS 除了可以进行转移以外还可以处理 d e p dep dep 数组,于是我采用记忆化搜索实现。

Code:GitHub CodeBase-of-Plozia P3959 [NOIP2017 提高组] 宝藏.cpp

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值