ことばがありあまれどなお、 このゆめはつづいてく|

trsins

园龄:3年10个月粉丝:18关注:2

【做题记录】HEOI2013 SAO

  • HEOI2013 SAO

    • 算法:dp

题目:

给出一棵边有方向的树,求该图的拓扑序数量。

n103

题解:

先将这玩意当做普通的树来做。

fu,i 表示节点 u 在子树中的排名为 i 的方案数。

那么考虑类似于树形背包,将 v 加入子树 u 来转移。

  1. v 连向 u

所以 u 拓扑序比 v 大。

u 原来的排名为 pv 原来在其子树中的排名为 q

fu,ku 加入 v 这棵子树后 u 排名为 k 的方案。

那么 v 中就必然有 kp 个节点的拓扑序比 u 小。而 v 的排名比 u 前。

所以转移的限制是 qkpp+qk

考虑现在比 u 小的节点有 k1 个,原来比 u 小的有 p1 个,显然这些点是确定的,所以只需要考虑顺序,方案数为 (k1p1)。那么剩下比 u 排名大的同理方案数为 (szu+szvkszup)

所以可得转移为

fu,k=p=1szuq=1szv[p+qk]fu,pfv,q(k1p1)(szu+szvkszup)

  1. u 连向 v

与第一种同样的方法。

直接上转移:

fu,k=p=1szuq=1szv[p+q>k]fu,pfv,q(k1p1)(szu+szvkszup)

考虑优化。

先提出 p

fu,k=p=1szufu,p(k1p1)(szu+szvkszup)q=1kpfv,q

fu,k=p=1szufu,p(k1p1)(szu+szvkszup)q=kp+1szvfv,q

发现直接搞一个前缀和就好了。

su,ifu,i 的前缀和。

fuk=p=1szufu,p(k1p1)(szu+szvkszup)sv,q

fuk=p=1szufu,p(k1p1)(szu+szvkszup)(sszvskp)

时间复杂度 O(n2)

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/15815374.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(34)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示