ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

9D - How many trees?

2021-04-06 14:04:57  阅读:192  来源: 互联网

标签:结点 && int 高度 9D trees How ull sb


原题链接https://codeforces.com/problemset/problem/8/C

这题自己sb,后面s数组没有加够,出现了空值,调了老半天,我是sb。

题意:
给你n个结点,权值1~n,问你最多能组成多少棵深度不小于 k 的二叉搜索树。

思路:大的树是由小的树构成的,因此可以递推(DP)。详情见代码,有注释。

代码如下

int n, h; 
ull ans;
ull f[N][N];// f[i][j] 表示结点数是 i ,高度是 j 的树的数目 
ull s[N][N];

int main()
{
	IOS;
	cin >> n >> h;
	f[0][0] = 1;	//没有结点也认为是 1 ,毕竟可以没有一边的儿子
	for(int i = 0 ; i <= n ; i ++) s[0][i] = 1;	 
	
	for(int i = 1 ; i <= n ; i ++)
	{
		for(int j = 1 ; j <= i ; j ++)	//从左到右枚举 
		{
			int l = j - 1, r = i - j;	//左边结点数和右边结点数 
			int c = max(l, r);
			for(int k = 0 ; k <= c ; k ++)
			{
				if(l >= k && k - 1 >= 0)
					f[i][k + 1] += f[l][k] * s[r][k - 1];	//左边是高度为 k,右边比这小 										
				if(r >= k && k - 1 >= 0)
					f[i][k + 1] += f[r][k] * s[l][k - 1];	//右边是高度为 k,左边比这小 
				if(l >= k && r >= k)						//左右高度相等的情况 
					f[i][k + 1] += f[r][k] * f[l][k];
			}
		}
		for(int j = 1 ; j <= n ; j ++)	//一定要加到n 因为只要比这 k - 1比较大时要有数值 
			s[i][j] = f[i][j] + s[i][j - 1];				
	}

	
	for(int i = h ; i <= n ; i ++)
		ans += f[n][i];
	cout << ans << endl;
	
	return 0;
}

标签:结点,&&,int,高度,9D,trees,How,ull,sb
来源: https://www.cnblogs.com/luoyicong/p/14621505.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有