我是靠谱客的博主 繁荣老师,最近开发中收集的这篇文章主要介绍牛客13593 大家一起来数二叉树吧 简单dp,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目连接:大家一起来数二叉树吧

题目描述

某一天,Zzq正在上数据结构课。老师在讲台上面讲着二叉树,zzq在下面发着呆。
突然zzq想到一个问题:对于一个n个节点,m个叶子的二叉树,有多少种形态呐?你能告诉他吗?
对于第一组样例的解释
在这里插入图片描述

输入描述

每一组输入一行,两个正整数n,m(n<=50)意义如题目

输出描述

每一行输出一个数,表示相应询问的答案取模1000000007

题意

n个节点,m个叶子,问有多少种形态的二叉树

题解

二叉树的每一次延伸一个节点相当于加上一棵子树,考虑到是二叉树,所以考虑一左一右相当于*2。所以当你需要x个节点,其中有y个叶子时候,就需要考虑x个节点y个叶子拆分后分配到左右子树上,而且拆分后又变成了一个子子树,这个子子树又有它本身多种形态,所以需要乘法。
故dp核心式子是 dp[i][j]=(dp[i][j]+dp[x][y]dp[i-x-1][j-y]%mod)%mod,
中i代表的总节点数,j代表的是总叶子数,x代表的是左子树的节点数,y代表的是左子树的叶子数,而i-x-1代表的右子树的节点数(-1是取出头节点),y-代表的是左子树的叶子数。

#pragma GCC optimize(2)
#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define endl "n"
const int mod=1e9+7;
ll dp[55][55];
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    dp[0][0]=1;dp[1][1]=1;
   	for(int i=1;i<=50;i++)
   		for(int j=1;j<=i;j++)
			for(int x=0;x<i;x++)
				for(int y=0;y<=j;y++)
					dp[i][j]=(dp[i][j]+dp[x][y]*dp[i-x-1][j-y]%mod)%mod;		
	int n,m;
	while(cin>>n>>m)cout<<dp[n][m]<<endl;
    return 0;
} 

最后

以上就是繁荣老师为你收集整理的牛客13593 大家一起来数二叉树吧 简单dp的全部内容,希望文章能够帮你解决牛客13593 大家一起来数二叉树吧 简单dp所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部