51Nod-1603-限高二叉排列树
2017-03-07 17:18
120 查看
ACM模版
简单地说,也就是求 n 个结点所能构成的高度大于等于 h 的二叉树种数。典型的 dp 问题,设 dp[i][j] 表示 i 个结点且高度小于等于 j 的树个数,中间利用乘法原理合并树累加求各个状态结果,最后输出 dp
- dp
[h - 1] 即可。
描述
题解
题目好长,长得我看了两遍都没有看懂,看来学理工科时间长了,语文水平有所下降。简单地说,也就是求 n 个结点所能构成的高度大于等于 h 的二叉树种数。典型的 dp 问题,设 dp[i][j] 表示 i 个结点且高度小于等于 j 的树个数,中间利用乘法原理合并树累加求各个状态结果,最后输出 dp
- dp
[h - 1] 即可。
代码
#include <iostream> using namespace std; typedef long long ll; const int MAXN = 40; ll dp[MAXN][MAXN]; // dp[i][j] i 个结点且高度小于等于 j 的树个数 int main() { int n, h; scanf("%d%d", &n, &h); for (int i = 0; i <= n; i++) { dp[0][i] = 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { for (int k = 1; k <= i; k++) { dp[i][j] += dp[k - 1][j - 1] * dp[i - k][j - 1]; // 乘法原理合并树 } } } cout << dp - dp [h - 1] << endl; return 0; }
相关文章推荐
- 51nod 1603 限高二叉排列树 计数dp
- 51nod 1603 限高二叉排列树(求补思想->DP)
- 51nod 1603 限高二叉排列树
- 51nod-1603 限高二叉排列树
- 51NOD 1202 子序列个数 DP
- 51nod 1062 序列中最大的数
- 51NOD 1237 最大公约数之和 V3 [杜教筛]
- 51Nod 1503 猪和回文
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
- 51nod 1376:最长递增子序列的数量
- 51nod 1674 区间的价值 V2
- 51Nod-1562-玻璃切割
- 51Nod 1267 4个数和为0 ( 二分
- 51nod_1008 N的阶乘 mod P
- AC日记——还是01串 51nod 1396
- 【51Nod 1363】最小公倍数之和
- 51nod_1134 最长递增子序列(O(n*logn))
- 【51Nod】1001 数组中和等于K的数对
- 51nod_1264线段相交
- 51nod 1433 0和5(数学)