题目
流量监控 - HDU 7401 - Virtual Judge
简单来说,T(T<=20)组样例,sumn不超过2e4
每次给定一棵n(n<=2000)个点的树,两问:
①将n个点恰拆成n/2个pair(u,v),要求一个点是另一个点的祖先,求方案数
②若两个pair(u,v)、(w,x)满足:
u是v、w、x的祖先,w是v、x的祖先,v是x的祖先
即,四个点都在x通往根的路径上,且[u,v]和[w,x]相交,则称形成了一个区间交,
在①的所有合法方案数中,求区间交的总数
输出①、②的值,答案对998244353取模
思路来源
jiangly代码&heltion&tiger2005&夏老师
题解
对着jiangly代码,找了若干人讨论,终于讨论明白了
第一问,dp[i][j]表示i子树内当前有j个未匹配的点的方案数,
转移是一个树上背包,对子树做完树上背包之后,
再考虑u这个点的决策,要么是(,要么是)
换句话说,要么选一个之前未匹配的点进行匹配,要么新增一个未匹配的点
第二问,长度为4的祖先链(都在通往祖先的一条路径上),所以可以考虑把0-4都维护上,
这里实际是考虑每个长度为4的链的贡献,
即在dp的时候并不指定这四个点连的方式,只统计四元组的总方案数,
然后根据题目要求, 最后的时候将13相连、24相连
这相当于求从树上抠掉四个点(四个点在一条祖先链上)时,剩下的点构成合法方案的方案数
f[i][j][k]表示考虑到j的子树,当前抠掉了i个
流量监控题目的树形DP与背包解法

博客围绕流量监控 - HDU 7401题目展开,包含两问,一是将点拆成pair求方案数,二是求区间交总数。思路源于多人,题解采用树形DP和背包方法。第一问用dp[i][j]表示方案数,转移是树上背包;第二问用f[i][j][k],类似二维背包求解。
最低0.47元/天 解锁文章
361

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



