CodeForces 9D How many trees(组合数学&dp)

How many trees?(组合数学&dp)

题目大意

给出n个标号从1-n的节点问可以组成多少高度大于等于h的二叉树(其中值遍历遍历为1-n)

解题思路

设由i个节点构成的高度小于j的树的数量为dp[i][j].设根节点为k+1,则这棵树的高度小于h的组合种数就是左子树k个节点构成高度小于h-1的种数乘上右子树n-k-1个节点构成高度小于h-1构成的树的种数

也即
d p [ i ] [ j ] = d p [ i ] [ j ] + k [ 0 , i ) d p [ k ] [ j 1 ] d p [ i 1 k ] [ j 1 ] dp[i][j]=dp[i][j]+\sum_{k\in [0,i)}dp[k][j-1]* dp[i-1-k][j-1]

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
LL dp[40][40];
int main()
{
	int n,h;
	scanf("%d%d",&n,&h);
	memset(dp,0,sizeof(dp));
	for(int i=0;i<=n;i++) dp[0][i]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=0;k<i;k++) dp[i][j]=dp[i][j]+dp[k][j-1]*dp[i-1-k][j-1];
		}
	}
	printf("%lld\n",dp[n][n]-dp[n][h-1]);
}

猜你喜欢

转载自blog.csdn.net/baiyifeifei/article/details/89398155