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 ...
随机推荐
- Habse中Rowkey的设计原则——通俗易懂篇
Hbase的Rowkey设计原则 一. Hbase介绍 HBase -> Hadoop Database,HBase是Apache的Hadoop项目的子项目.HBase不同于一般的关系数据库,它 ...
- Asp.net Web Api开发Help Page 添加对数据模型生成注释的配置和扩展
在使用webapi框架进行接口开发的时候,编写文档会需要与接口同步更新,如果采用手动式的更新的话效率会非常低.webapi框架下提供了一种自动生成文档的help Page页的功能. 但是原始版本的效果 ...
- Bootstrap基础篇—常见的CSS类
一.标题 标签 大小 h1 36px h2 30px h3 24px h4 18px h5 14px h6 12px 二.常见的内联样式 标签 用途 del 删除的文本 s 无用的文本 ins 插入的 ...
- 文件包含漏洞(RFI)
1文件包含漏洞简介 include require include_once require_once RFI综述 RFI是Remote File Inclusion的英文缩写,直译过来就是远 ...
- selenium元素定位(三)
使用selenium就不可避免的要提到界面元素定位,通过元素定位来实现一系列的逻辑操作. selenium提供了8中元素定位的方式: id.name.class name.tag name.link ...
- [JSON].set(keyPath, value)
语法:[JSON].set( keyPath, value ) 返回:[True | False] 说明:设置键值 参数: keyPath [keyPath 必需] 键名路径字符串 value ...
- Python基础 之 tuple类-元组 和 dict类-字典
tuple 元组 一.tuple 类的基本属性 1.元组,有序:元素不可被修改,不能被增加或者删除tuple类 tu = (111,22,33,44) 一般写元组的时候,推荐在最后加入,和类方法进行区 ...
- 【第三章】Shell 变量的数值计算
一.算数运算符 shell中常见的算术运算符: shell中常见的算术命令: 1. 整数运算 方法一:expr expr命令就既可以用于整数运算,也可以用于相关字符串长度.匹配等的运算处理: exp ...
- Kali渗透测试-SNMP
1.snmpwalk -v指定snmpwalk版本 -c指定密码 2.snmp-check 获取系统信息,主机名,操作系统及架构 获取用户账户信息 获取网络信息 获取网络接口信息 IP信息 路由信息 ...
- nodejs笔记--基础篇(一)
Sublime Node.js开发环境配置 下载并安装Node.js安装包后再开始配置 1.先安装好Sublime Text 2 2.运行Sublime,菜单上找到Tools ---> Buil ...