【NOIP模拟赛】超级树 DP

这个题我在考试的时候把所有的转移都想全了就是新加一个点时有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);
}

 

posted @ 2017-09-15 21:47  TS_Hugh  阅读(220)  评论(0编辑  收藏  举报