【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); }
苟利国家生死以, 岂因祸福避趋之。