usaco Cow Pedigrees

题意

有n个节点二叉树,每个节点有0\2个儿子,给定最大深度k,求方案数%9901

n<=500

题解

$dp$定义很

$f[i][j]$表示i个节点组成至多j层方案数

考虑答案

$f[n][k]$表示包含$1-k$所有层数方案数

$f[n][k-1]$表示包含$1-(k-1)$所有层数方案数

于是$f[n][k]-f[n][k-1]$就是答案

转移就是枚举除了根节点分给两个子树多少个

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 9901
ll f[520][520];
ll n,k;
int main(){
    scanf("%lld%lld",&n,&k);
    for(ll i=1;i<=k;i++)
        f[1][i]=1;
    for(ll i=1;i<=k;i++)
        for(ll j=3;j<=n;j+=2)
            for(ll q=1;q<j;q+=2)
                (f[j][i]+=(f[j-q-1][i-1]*f[q][i-1])%mod)%=mod;
    printf("%lld\n",(f[n][k]-f[n][k-1]+mod)%mod);
}
View Code

 

posted @ 2019-10-14 21:45  znsbc  阅读(103)  评论(0编辑  收藏  举报