码迷,mamicode.com
首页 > 其他好文 > 详细

9D - How many trees?

时间:2021-04-07 11:25:35      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:set   情况   表示   https   int   相等   数值   com   return   

原题链接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;
}

9D - How many trees?

标签:set   情况   表示   https   int   相等   数值   com   return   

原文地址:https://www.cnblogs.com/luoyicong/p/14621505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!