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]$就是答案

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

代码

usaco Cow Pedigrees
#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

 

上一篇:零基础入门学习Python | 第003讲:插曲之变量和字符串


下一篇:J-520-2018年第二届河北省大学生程序设计竞赛