【NOIP模拟赛】超级树 DP

时间:2022-02-23 20:43:46

这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........

这个题的正解体现了一种神奇的思想,对于好合并但是不好转移的dp我们可以先打散然后合并到最后,所以我们从一开始维护f[i][j]表示i阶超级树中有j个互不相交的路径的方案数。

#include <cstdio>
typedef
long long LL;
LL f[
310][310],mod,temp;
int n;
int main(){
scanf(
"%d%lld",&n,&mod);
f[
1][0]=f[1][1]=1;
for(int i=1;i<n;i++){
for(int k=0;k<=n;k++)f[i][k]%=mod;
for(int l=0;l<=n;l++)
for(int r=0;l+r<=n;r++)
temp
=f[i][l]*f[i][r]%mod,
f[i
+1][l+r]+=temp*(1+(l+r)*2),
f[i
+1][l+r+1]+=temp,
f[i
+1][l+r-1]+=temp*(l*r*2+(l*(l-1)+r*(r-1)));
}
printf(
"%lld",f[n][1]%mod);
}