![牛客练习赛93-C题-点权,第1张 牛客练习赛93-C题-点权,第1张](/aiimages/%E7%89%9B%E5%AE%A2%E7%BB%83%E4%B9%A0%E8%B5%9B93-C%E9%A2%98-%E7%82%B9%E6%9D%83.png)
牛客练习赛93-C题-点权
ps:这道题当时赛场上脑抽想到拓扑排序去了,这题并不能用拓扑排序写,因为这题要求将点权变成2的最小花费,而这最小花费是与边权有关系的,而与深度没关系。
如何想到树形dp?:题目已经明说这是一颗树了,首先我们不难看到更新都是从叶结点向上传递,这就满足了dp的无后效性,又因为不难发现每一个点作为根节点结果都不同,于是我们不难想到一个o(n*n)的算法。
朴素算法o(n*n):枚举每一个结点作为根节点,然后进行树形dp,每个结点调最小的那个值即可。
改进-换根法o(n):不难发现以上模型就是换根法的模型,我们可以将其优化成o(n),即两次进行两次树形dp。
第一次树形dp(从底向上):依据经验我们设dp[i]为结点i由子结点更新的最小花费
状态转移方程:
第二次树形dp(从上向底):依据经验我们设f[i]为结点的最小花费
状态转移方程:
其实某一点一定是从子节点或者父亲结点更新过来的,这点也能看出是换根法。
AC代码:
#include
#include
#include
#include
#include
评论列表(0条)