CF9d How many trees?
题意:求节点数为n的,高度大于等于h的二叉树的个数。
题解:
一开始没看到二叉树的限制,,,想了好久。因为数据范围很小,所以可以考虑一些很暴力的做法。
有2种DP方式都可以过。
1,f[i][j]表示节点数为i,高度恰好为j的方案数,那么$ans = \sum_{i = h}^{i <= n}{f[n][i]}$.
于是考虑转移,首先枚举节点数i,然后枚举左儿子Size j,顺便就可以算出右儿子Size,但是因为先枚举节点数为i时的高度不方便转移,所以考虑直接枚举左儿子高度和右儿子高度,然后直接转移即可(具体转移方程看代码)。
复杂度$n ^ 4$
2,f[i][j]表示节点数为i,高度小于等于j的方案数,那么$ans = f[n][n] - f[n][h - 1]$.
考虑转移,直接枚举左儿子Size,那么就可以算出右儿子Size了,然后因为是高度小于等于j的方案数,所以只需要从f[lson][j - 1] * f[rson][j - 1]转移而来即可。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 40
#define LL long long int n, h;
LL ans, f[AC][AC];//i个点,高度恰好为j的方案数 void pre()
{
scanf("%d%d", &n, &h);
} void work()
{
f[][] = ;
for(R i = ; i <= n; i ++)//枚举点数
for(R j = ; j < i; j ++)//枚举左子树Size
{
int b = i - j - ;//右子树大小
for(int l = ; l <= j; l ++)//枚举左子树高度
for(int k = ; k <= b; k ++)//枚举右子树高度
f[i][max(l, k) + ] += f[j][l] * f[b][k];
}
for(R i = h; i <= n; i ++) ans += f[n][i];
cout << ans << endl;
} void work2()//f[i][j]表示节点数为i,高度小于等于j的方案数
{
for(R i = ; i <= n; i ++) f[][i] = ;
for(R i = ; i <= n; i ++)//枚举高度
for(R j = ; j <= n; j ++)//枚举节点个数
for(R k = ; k < j; k ++)//枚举左子树size
f[j][i] += f[k][i - ] * f[j - k - ][i - ];
cout << f[n][n] - f[n][h - ] << endl;
} int main()
{
//freopen("in.in", "r", stdin);
pre();
work2();
//fclose(stdin);
return ;
}
CF9d How many trees?的更多相关文章
- [CF9D]How Many Trees?_动态规划_树形dp_ntt
How many trees? 题目链接:https://www.codeforces.com/contest/9/problem/D 数据范围:略. 题解: 水题. $f_{i,j}$表示$i$个节 ...
- CF9D How many trees? (dp)
这题我想了好久 设 \(f_{i,j}\) 为 \(i\) 结点 \(<=j\) 的方案数 固定根,枚举左右子树,就有: \[f_{i,j}=\sum_{k=0}^{n-1}f_{k,j-1}* ...
- 【DP】【CF9D】 How many trees?
传送门 Description 给你两个正整数\(n,h\),求由\(n\)个点组成的高度大于等于\(h\)的二叉树有多少个 Input 一行两个整数\(n,h\) Output 一个整数代表答案. ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- hdu2848 Visible Trees (容斥原理)
题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...
- [LeetCode] Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- 2 Unique Binary Search Trees II_Leetcode
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
随机推荐
- VINS(四)初始化与相机IMU外参标定
和单目纯视觉的初始化只需要获取R,t和feature的深度不同,VIO的初始化话通常需要标定出所有的关键参数,包括速度,重力方向,feature深度,以及相机IMU外参$R_{c}^{b}$和$p_{ ...
- 调用bash的时候出现curl command not found
调用bash的时候出现curl command not found 解决办法: apt-get install curl
- iOS 测试工具reveal可视化调试工具的使用
简单翻译一下reveal可视化图形工具插入项目的官方文档(官方英文版file:///Applications/Reveal.app/Contents/SharedSupport/Documentati ...
- Visual Studio 智能提示功能消失解决办法
步骤如下: 开始菜单 -->所有程序-->Visual Studio 2012文件夹 --> Visual Studio Tools --> Developer Command ...
- js屏蔽/过滤 特殊字符,输入就删除掉,实时删除
1.替换方法: <input type="text" class="domain" onkeyup="this.value=this.value ...
- JAVA基础学习之路(一)基本概念及运算符
JAVA基础概念: PATH: path属于操作系统的属性,是系统用来搜寻可执行文件的路径 CALSSPATH: java程序解释类文件时加载文件的路径 注释: 单行注释 // 多行注释 /*... ...
- 腾讯云ubuntu安装使用MySQL
安装步骤 ubuntu@VM---ubuntu:~$ sudo apt-get install mysql-server (密码: root/root) ubuntu@VM---ubuntu:~$ s ...
- [Clr via C#读书笔记]Cp9参数
Cp9参数 可选参数和命名参数 参数设置了默认值(设置要从右到左,有默认值的参数必须放在没有默认值的参数的后面,默认值必须是常量),就可以使用可选参数和命名参数了.向方法传递实参的时候,编译器按照从左 ...
- JavaScript筑基篇(二)->JavaScript数据类型
说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 numb ...
- maven把项目打包成jar包后找不到velocity模板的bug
使用springmvc 开发时候要实现发送velcotiy模板邮件,在配置正常后,在本地测试正常后,使用maven打包成jar包后,报以下错误, Caused by: org.apache.veloc ...