云云更开心
作者:互联网
云题合集
$NOI2020$命运
题目大意$:$
每条边有两个状态$(0,1)$,问满足所有限制$($每一条规定链之间必然有一个$1)$
一眼上去肯定是$dp$,考虑怎么设状态
还是说第一维肯定是节点$x$,那么第二维设置什么合适
我一开始想的是记录哪些被满足,哪些没被满足,显然复杂度过高
我每次转移的时候发现能像树形$dp$一样,通过转移子树,来确定每个边的状态
每次转移可以根据枚举这个边的所有状态,然后得到下一步所有的状态
考虑这个东西,我们可以确定一个状态,那么我们还是可以在第二维确定哪些条件没被满足
只不过,我们可以不记录那个状态到底哪些没被满足,我们可以只记录没被满足的起点最深的在哪
为什么,显然可以得到所有状态,考虑每种状态肯定都有一个没有满足条件的起点最深的条件那么就按这个东西另存一维就好了
到这里,我貌似理解了$dp$本质,大概就是把所有状态归成一类,统计这一类的所有方案数,然后分情况讨论罢了
$dp[x][i]$表示子树$x$的状态已经确定,未满足条件的下端点在子树内部的最大深度是多少
那么就可以转移了,直接考虑着一条边选不选就好了,那么我考虑每一次都能转移到最深的就好了,并且我转移的必须保证以后能转移到最终方案
$dp'[x][i]=\sum_{j=0}^{dep_x}dp[x][i]\times dp[y][j]+\sum_{j=0}^{i}dp[x][i]\times dp[y][j]+\sum_{j=0}^{i-1}dp[x][j]\times dp[y][i]$
后面那个$i-1$是防止深度都是$i$的方案被算两次
到了这,咱们就有$64pts$了
至于正解嘛,这个东西可以线段树合并,毕竟是前缀和...
重写以下式子
$dp'[x][i]=dp[x][i]\times sum[y][dep_x]+dp[x][i]\times sum[y][i]+sum[x][i-1]\times dp[y][i]$
$dp'[x][i]=dp[x][i]\times(sum[y][dep_x]+sum[y][i])+dp[y][i]\times sum[x][i-1]$
这个的话,大概就是一个区间乘$sum[y][dep_x]$
实现的话,也很好说,第一部分先求个$sum[y][dep_x]$.递归到最底层然后乘上这个东西
上面的两个$sum$显然是可以在递归时候累加的
标签:云云,开心,状态,dep,sum,times,转移,dp 来源: https://www.cnblogs.com/Eternal-Battle/p/15962200.html