树形dp。
二三两
口禾火
展开
-
noi2011 道路修建(树形dp)
无根树,揪出结点1当根。 dfs求f[i]子树大小。 对于点i以及与之相连的点j,可知i一侧的点数为f[i],j一侧为n-f[i],故修路费用即为e[i].v*abs(n-2*f[e[i].y])。e[i].v是道路长度。 注意,由于是递归求法,从下往上计算,故j必然是i的上层。为了避免双向边的重复统计和错误统计(方向反了),code里用了一个玄学操作。即更新时标记那条边。 inlin...原创 2018-03-18 19:15:42 · 241 阅读 · 0 评论 -
#454 最大利润(树形dp)
贯彻树形dp第一维通常是节点编号的思想,f[i]表示以i点为根的子树的最大利润。根据题意,相连的两点不能同时取,故可想到增加一维表示i点取或不取:f[ i ][ 0 ]表示不取,f[ i ][ 1 ]表示取。 那么我们就可以列出状态转移方程了: f[ i ][ 1 ] = ∑ f[ x ][ 0 ] + value[ i ] ; f[ i ][ 0 ] = ∑ max( f[ x ][...原创 2018-03-21 21:21:42 · 234 阅读 · 0 评论 -
Codeforces 700B 友好城市(树形dp)
感觉现在的我还比较难想到这个思路啊。 距离累加和,是由边决定的,所以我们计算每条边的贡献。 可以知道,对于一条边e,如果起点端有 x 个友好城市,终点端有 y 个友好城市,那么这条边的最大贡献就是 min( x,y ),因为少的那端怎么样也只有x个,再没法提供城市给另一端匹配了。 至于如何求一端的友好城市数,实际上就是求子集(当然子节点应该是友好城市才能计数)大小,因为这端是 x ,那另...原创 2018-04-08 21:04:45 · 259 阅读 · 0 评论