ZOJ_-1470--How Many Trees
2013-06-22 10:45
399 查看
题目大意:给出平衡二叉树的定义(即左右子树高度差不超过1,然后递归定义),题目输入树的节点数和叶子树,求符合条件的平衡二叉树的数量是多少?
是个DP吧。
dp[i][j][k]表示节点数为i,叶子树为j,高度为k的平衡二叉树的数量。
题目给出的条件n<=20,m<20.树的高度上限为6.
初始条件dp[0][0][0]=dp[1][1][1]=1;
需要构造一颗高度为k 的平衡二叉树的,则有三种情况可以构造:
1)左右子树的高度都是k-1。
2)左子树高度是k-1,右子树高度是k-2.
3)左子树高度是k-2,右子树高度是k-1.
根据乘法原理和加法原理:
所以有转移方程:
是个DP吧。
dp[i][j][k]表示节点数为i,叶子树为j,高度为k的平衡二叉树的数量。
题目给出的条件n<=20,m<20.树的高度上限为6.
初始条件dp[0][0][0]=dp[1][1][1]=1;
需要构造一颗高度为k 的平衡二叉树的,则有三种情况可以构造:
1)左右子树的高度都是k-1。
2)左子树高度是k-1,右子树高度是k-2.
3)左子树高度是k-2,右子树高度是k-1.
根据乘法原理和加法原理:
所以有转移方程:
dp [m][k]=sum{ dp[i][j][k-1]*dp[n-1-i][m-j][k-1] + dp[i][j][k-1]*dp[n-1-i][m-j][k-2] + dp[i][j][k-2]*dp[n-1-i][m-j][k-1] | 0<=i<n,0<=j<=m }
#include<iostream> #include<cstring> #include<cstdio> #define maxn 21 using namespace std; int dp[maxn][maxn][maxn];//dp[i][j][k]表示节点数为i,叶子数为j,高度为k的树的数量 int n,m;//n是节点数,m是叶子数量 bool init() { if(scanf("%d%d",&n,&m)!=EOF) { memset(dp,0,sizeof(dp)); return true; } return false; } void solve() { for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { for(int k=0;k<=6;k++) { int &tar=dp[i][j][k]; if(i==0||k==0) { tar=(i==0)&&(j==0)&&(k==0); } else if(i==1||k==1) { tar=(i==1)&&(j==1)&&(k==1); } else { for(int g=0;g<i;g++)//枚举左子树的节点数 { for(int lg=0;lg<=j;lg++)//枚举左子树的叶子数 { tar+=dp[g][lg][k-1]*dp[i-1-g][j-lg][k-1]; tar+=dp[g][lg][k-1]*dp[i-1-g][j-lg][k-2]; tar+=dp[g][lg][k-2]*dp[i-1-g][j-lg][k-1]; } } } //printf("dp[%d][%d][%d]=%d\n",i,j,k,tar); } } } //check(); int ans=0; for(int i=0;i<=6;i++) { ans+=dp [m][i]; } cout<<ans<<endl; } int main() { while(init()) solve(); return 0; }
相关文章推荐
- zoj How Many Shortest Path 网络流 不相交最短路条数
- ZOJ 2760 How Many Shortest Path (不相交的最短路径个数)
- HDOJ HDU 1130 How Many Trees?
- ZOJ 2760 How Many Shortest Path
- [容斥原理] zoj 3556 How Many Sets I
- UVa10303 - How Many Trees?
- ZOJ3556 How Many Sets I(容斥)
- 日期问题模版ZOJ Problem Set -3950 How Many NinesZOJ 找9
- HDU 1130 How Many Trees? 卡特兰数
- zoj 1716 Get Many Persimmon Trees
- ZOJ 3556 How Many Sets I
- HDU 1130 How Many Trees?
- ZOJ - 3950 How Many Nines(模拟)
- hdu 1130 How Many Trees?(Catalan数)
- ZOJ 2760 - How Many Shortest Path(网络流’最大流)
- zoj 3556 How Many Sets I(容斥原理)
- POJ 2029 && ZOJ 1716 Get Many Persimmon Trees
- ZOJ 3557 How Many Sets II
- uva 10303 How Many Trees?
- ZOJ 3950 How Many Nines (预处理)