[P1472] 奶牛家谱 (DP)

本文探讨了求解具有特定深度k和节点数n的二叉树方案数量的问题,采用动态规划(DP)方法进行解答。通过定义状态f[i][j]表示有i个节点且深度小于等于j的二叉树方案数,推导出状态转移方程,并附带实现代码。

题意:给一棵度数为 0或 2的二叉树,求有 n个节点的深度为 k的二叉树的方案数;

解法:DP;

1.DP;我们可以设 f [ i ] [ j ] 表示有 i个节点的深度 <= j的二叉树的方案数,那么很显然,最后的答案就是 f [ n ] [ k ] - f [ n ] [ k - 1 ] ,那么状态转移方程该如何写呢?假设这整棵树有 x个节点,此时这棵树的深度为 k,那么除去根节点,我们可以枚举有 t个节点在左子树,有 x - 1 - t个节点在右子树,所以得出 f [ x ] [ k ] = ∑ ( f [ t ] [ k - 1 ] × f [ x - 1 - t ] [ k - 1 ] ) ;

附上代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int mod = 9901;

int n,k;
int f[210][210]; 

int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;++i) f[1][i]=1;
    for(int x=1;x<=k;++x)
    for(int i=3;i<=n;i+=2)
    for(int j=1;j<i;j+=2) f[i][x]=(f[i][x]+(f[j][x-1]*f[i-j-1][x-1]%mod))%mod;
    cout<<(f[n][k]-f[n][k-1]+mod)%mod;
    return 0;
}

 

转载于:https://www.cnblogs.com/nnezgy/p/11538407.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值