题目大意:
mhy住在一棵有n
个点的树的1
号结点上,每个结点上都有一个妹子。
mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为。
树上的每条边mhy能且仅能走两次,每次耗费1
单位时间。mhy送完所有电脑后会回自己家里然后开始装zhx牌杀毒软件。
卸货和装电脑是不需要时间的。
求所有妹子和mhy都装好zhx牌杀毒软件的最短时间。
分析一下题意:
树上的每条边mhy能且仅能走两次,这个有什么用?
很有用。自己想想!我不说了,模拟模拟就出来了。
然后很容易就能想到树形DP
那么先定义状态:
f[i]表示以i为节点的树的最短时间。
(a[i]代表 i 节点的时间,size[i]代表 i 子树的规模)
假设u节点有儿子x和y,则如果先走 x 的话 u 的时间就为max(f[x]+1,f[y]+2*size[x]+1);同理,先走 y 的话 u 的时间就为max(f[y]+1,f[x]+2*size[y]+1),若先安装x合适,则必有2*size[x]+f[y]+1>2*size[y]+f[x]+1,即f[x]-2*size[y]<f[y]-2*size[x],既然这样,我们排序即可。
f[i]=max(a[i],max(f[y]+1,f[x]+2*size[y]+1));
代码我没有哦!
为啥没有呢!因为这个思路就是错误的!
大家先想想为啥是错的!
错因很简单,仔细看题就出来了!
未完待续
原文地址:https://www.cnblogs.com/DZN2004/p/12652571.html
时间: 2024-11-08 15:01:51