求 nn
個結點的隨機生成森林的 期望最高樹高 .
設 f[i,
j,k]
f[i,
j,k]
表示高度為 i
i, 使用 j
j 個球, k
k 個球在頂部的概率,f[
i,j,
k]=f
[i,j
−1,k
]∗j−
3j−1
+f[i
,j−1
,k−1
]∗1j
−1+f
[i−1
,j−1
,p]∗
1j−1
f[i,
j,k]
=f[i
,j−1
,k]∗
j−1j
−3+
f[i,
j−1,
k−1]
∗j−1
1+f
[i−1
,j−1
,p]∗
j−11
時間複雜度 o(n
4)o(
n4), 沒有 ded
e 出 bug
bug, 暴力保底 30pt
s30p
ts .題
意:題意
: 起初只有乙個根, 每次隨機乙個點加乙個兒子, 求出最後形成的 n
n 個節點的樹的期望高度 .這裡
沿用原題
解的幾個
定義↓這
裡沿用原
題解的幾
個定義↓
說實話剛開始我覺得很迷 .f[
i,j]
f[i,
j]很好轉移:f[
i,j]
=f[i
−1,j
−1]∗
j−1i
+f[i
−1,j
]∗i−
jif[
i,j]
=f[i
−1,j
−1]∗
ij−1
+f[
i−1,
j]∗i
i−j
然後是 g[i
,j]g
[i,j
] 的轉移:g[
i,j]
=∑k=
1if[
i,k]
∗f[k
,j]∗
g[i−
k,j]
g[i,
j]=k
=1∑i
f[i
,k]∗
f[k,
j]∗g
[i−k,j]
意為在有 i−k將若干深度不超過 j−1i−k 個點的森林基礎上生成一顆 j
j 個點的樹, 然後再取出其中滿足條件的樹 .
j−1 的樹組成的森林 連上同乙個根, 組成乙個深度不超過 j
j 的樹, 即 f[i
,j]=
g[i−
1,j−
1]f[
i,j]
=g[i
−1,j
−1] .
#include
#define reg register
intread()
while
(isdigit
(c)) s = s*
10+ c-
'0', c =
getchar()
;return s * flag;
}typedef
long
long ll;
const
int maxn =
305;
int n;
int mod;
int inv[maxn]
;int f[maxn]
[maxn]
;int g[maxn]
[maxn]
;int f[maxn]
[maxn]
;int
main()
for(reg int i =
0; i <= n; i ++
) g[0]
[i]=1;
for(reg int i =
1; i <= n; i ++
)for
(reg int j =
0; j <= n; j ++
)int ans =0;
for(reg int i =
1; i < n; i ++
) ans =
(1ll
*ans +((
1ll*f[n]
[i]%mod - f[n]
[i-1
]%mod)
*i%mod)
)% mod;
ans =
(1ll
*ans%mod + mod)
% mod;
printf
("%d\n"
, ans)
;return0;
}
P3914 染色計數 樹形dp
n nn個點每個點有些可以染的顏色,要求相鄰顏色不相同,方案總數。樹形d pdp dp,定義fx,if fx,i 表示點x xx的染顏色i ii的方案數。然後定義zx i 1 mfxi z x sum mf zx i 1m fxi 然後顯然動態轉移方程fx,i zy fy,i x y f z y f...
C Garland (樹形DP 子樹計數問題)
又攻克一道樹形dp題,首先子樹計數問題,感覺都是先自下而上跑一遍dfs,然後根據題意然後抉擇得套路。一顆有根樹,分成三棵子樹,保證點權和相互相等。分析 子樹滿足ans 3,並且ans 3 0加入就可以了,滿足兩個點或者以上,就是行 為啥說2以上 這裡就是我得wa得點,可以所有得點值為0,你就知道了 ...
樹形DP 樹形DP四例
是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...