题意:
给出一棵有nnn个结点的树,每棵结点iii有一个血量为hp[i]hp[i]hp[i]的怪物,需要花费他与距离他为1的所有地方的存活的怪物的血量总和的能力来击败他。现在有个人从1结点开始进攻怪物,直到所有怪物都死掉为止。他会吟唱一种魔法,每次吟唱会直接消灭任意一个地方的怪物,问使用kkk次的情况下,需要的起始能量最低是多少,才足以支持他杀完所有怪物?求出k=0,1,2,3,...,nk=0,1,2,3,...,nk=0,1,2,3,...,n的所有结果
Solution:
因为目前点的花费与儿子删除与否存在关系,所以多开一维保存点是否删除,设dp[u][i][0/1]dp[u][i][0/1]dp[u][i][0/1]为子树uuu,在子树内用iii次魔法,是否删去uuu的最少初始值是多少,那么只有当uuu和他的儿子vvv都没被删除时,才会需要初始值更大,于是有转移:
dp[u][i][0]=min(dp[u][j−k][0]+min(dp[v][k][0]+hp[v],dp[v][k][1])) dp[u][i][0]=min(dp[u][j-k][0]+min(dp[v][k][0]+hp[v],dp[v][k][1])) dp[u][i][0]=min(dp[u][j−k][0]+min(dp[v][k][0]+hp[v],dp[v][k][1]))
dp[u][i][1]=min(dp[u][j−k][1]+min(dp[v][k][0],dp[v][k][1])) dp[u][i][1]=min(dp[u][j-k][1]+min(dp[v][k][0],dp[v][k][1])) dp[u][i][1]=min(dp[u][j−k][1]+min(dp[v][k][0],dp[v][k][1]))
此时是必须选择一个合并的,而不能舍弃某棵子树,于是dp[u][i][0/1]dp[u][i][0/1]dp[u][i][0/1]是不能和自己取最小的,一般用两个数组来更新,初始化tmptmptmp为极大值,然后计算答案在

最低0.47元/天 解锁文章
1140

被折叠的 条评论
为什么被折叠?



