子树问题(DP)

mac2026-04-11  2

这题显然是DP

首先, d p [ i ] [ j ] dp[i][j] dp[i][j]表示树深度小于等于i,树的大小为j的有根树的数量$

可以循环枚举根节点编号次大的子树的大小k。

d p [ i ] [ j ] = ∑ k = 1 j − 1 d p [ i ] [ j − k ] ∗ d p [ i − 1 ] [ k ] ∗ C j − 2 k − 1 dp[i][j]=\sum^{j-1}_{k=1}dp[i][j-k]*dp[i-1][k]*C^{k-1}_{j-2} dp[i][j]=k=1j1dp[i][jk]dp[i1][k]Cj2k1

注释:第一个dp表示的是除去这棵大小为k的子树的有根树数量,第二个dp表示的是这棵大小为k的子树的有根树数量,最后要给每一个点分配编号,只用分编号给(k的子树)或(除去k的剩余树),所以乘一个 C j − 2 k − 1 C^{k-1}_{j-2} Cj2k1

因为一开始设的是深度小于等于i,所以最后要融斥去掉重复的树的数量。

因为一开始没有考虑这种树的好坏,所以当大小j是坏的时候,dp[i][j]=0。

最新回复(0)