Cow Pedigrees

本文介绍了一种使用动态规划解决特定二叉树结构计数问题的方法,并提供了详细的算法实现步骤及源代码。该算法适用于求解具有K层深度、N个节点的不同二叉树形态的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:求K层N节点的二叉树一共有种


解题思路

  1. 读入N和K
  2. DP问题,参考NOCOW解题思路(http://www.nocow.cn/index.php/USACO/nocows
  3. 关键步骤略有不同,如下
  4. for (i=2; i<=K; i++)
        {
    	for (j=1; j<=N; j+=2)
    	{
    	    for (k=1; k<=(j-2); k+=2)
    	    {
    		table[i][j] += (2*(smalltrees[i-2][k]*table[i-1][j-1-k]) + table[i-1][k]*table[i-1][j-1-k]);
    		table[i][j] %= 9901;
    	    }
    	    smalltrees[i][j] = ((smalltrees[i-1][j] + table[i][j]) % 9901);
    	}
        }


代码

/*
ID: zc.rene1
LANG: C
PROG: nocows
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    FILE *fin, *fout;
    int N, K;
    int **table, **smalltrees;
    int i, j, k;

    fin = fopen("nocows.in", "r");
    fout = fopen("nocows.out", "w");

    fscanf(fin, "%d %d", &N, &K);

    table = (int**)malloc((K+1)*sizeof(int*));
    smalltrees = (int**)malloc((K+1)*sizeof(int*));

    for (i=0; i<K+1; i++)
    {
	table[i] = (int*)malloc((N+1)*sizeof(int));
	smalltrees[i] = (int*)malloc((N+1)*sizeof(int));
	memset(table[i], 0, (N+1)*sizeof(int));
	memset(smalltrees[i], 0, (N+1)*sizeof(int));
    }

    table[1][1] = 1;
    smalltrees[1][1] = 1;

    for (i=2; i<=K; i++)
    {
	for (j=1; j<=N; j+=2)
	{
	    for (k=1; k<=(j-2); k+=2)
	    {
		table[i][j] += (2*(smalltrees[i-2][k]*table[i-1][j-1-k]) + table[i-1][k]*table[i-1][j-1-k]);
		table[i][j] %= 9901;
	    }
	    smalltrees[i][j] = ((smalltrees[i-1][j] + table[i][j]) % 9901);
	}
    }

    fprintf(fout, "%d\n", table[K][N]%9901);

    return 0;
}





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值