CF9D-How many trees?【dp】

正题

题目链接:https://www.luogu.com.cn/problem/CF9D


题目大意

n n 个点组成的深度大于 h h 的二叉树有多少个。


解题思路

定义 f i , j f_{i,j} 表示 i i 个点高度为 j j 的树有多少个,然后每次将两棵 ( a , b ) ( x , y ) (a,b)(x,y) 合并就有
f a + x + 1 , m a x { b , y } + 1 + = f a , b f x , y f_{a+x+1,max\{b,y\}+1}+=f_{a,b}*f_{x,y}

然后 O ( n 4 ) O(n^4) 转移即可。

好像可以用前缀和优化到 O ( n 3 ) O(n^3) 但是懒就不写了。


c o d e code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=40;
ll n,k,ans,f[N][N];
int main()
{
	scanf("%lld%lld",&n,&k);
	f[0][0]=1;
	for(ll i=1;i<=n;i++){
		for(ll x=0;x<=i;x++)
			for(ll y=0;y<i;y++)
				for(ll b=0;b<i;b++)
					f[i][max(y,b)+1]+=f[i-x-1][y]*f[x][b];
	}
	for(ll i=k;i<=n;i++)
		ans+=f[n][i];
	printf("%lld",ans);
}
发布了867 篇原创文章 · 获赞 55 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/103991812