codeforces 9d dp

题意:一个二叉树满足左儿子比自己小,右儿子比自己大的特性,有n个节点,问深度大于等于h的一共有多少种。

题解:对于第i个结点,把它看做根,那么合法的组合方案就是左子树的总数*右子树的总数,于是转移方程为

dp[i][j] = dp[k][j-1] * dp[i - k - 1][j-1] ,0 <= k < i  ,i:使用i个结点,j:深度

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll dp[40][40];
int main(){
   int n, h;
   scanf("%d %d", &n, &h);
   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[k][j - 1] * dp[i - k - 1][j - 1];
   }
   printf("%lld\n", dp[n][n] - dp[n][h - 1]);
   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86537667