[BZOJ3167][Heoi2013]Sao(樹形DP+組合數學)
Address
Solution
定義狀態:
表示
的子樹內所有的點進行排列,
排在位置
的方案數。
考慮按照樹形揹包的方式轉移,設
如何合併
和
呢?
先考慮
必須排在
後面的情況:
先列舉
和
,考慮如何從
和
合併到
。
(上面的
表示列舉到
的子節點
之前子樹中
的排名,
表示
的子樹內排名在
前面的點數)。
而如果
必須排在
的後面,這就要求了能參與轉移的
必須滿足
。
設
的子節點
之前子樹大小為
,
的子樹大小為
,如何求把
和
(
)合併起來的方案數呢?
這等價於把兩個長度分別為
和
的序列合併成一個序列,使得新序列任意兩個相同元素在原序列中的相對位置不變,並且對於
(
為新序列中第
個來自序列
的元素),必須滿足
到
中恰好有
個元素來自序列
。
這又等價於把
個元素切割成
塊(塊內可以為空),滿足前
塊裡恰好有
個元素。
根據組合數學的知識得到這樣的方案數為:
所以轉移:
排在
之前時: