11082 完全二叉树的种类 O(n) 卡特兰数
11082 完全二叉树的种类
时间限制:800MS 内存限制:1000K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
构造n个(2<=n<=20)叶结点的的完全二叉树(完全二叉树意味着每个分支结点都有2个儿子结点),有多少种构造方法? 注意:不改变n个结点的相对顺序,左右儿子不调换. 例如:
4个叶子节点A1,A2,A3,A4,可构造出如下完全二叉树,共5种。
再例如:5个叶子结点,A1,A2,A3,A4,A5,可构造出如下若干种完全二叉树形状,像这样的完全二叉树共有14种(下图
并未全部列出)。
输入格式
输入n,表示构造的完全二叉树有n个叶结点(2<=n<=20)。
输出格式
输出构造的完全二叉树的种类。
输入样例
5
输出样例
14
提示
作者
zhengchan
题解:
首先看一般的递推公式:题目规定是构造完全二叉树,那么不论怎么构造,根节点的左子树和右子树也都是完全二叉树。那么含有n个叶子的完全二叉树的构造方案数就等于左子树的方案数乘以右子树的方案数。列举所有左右子树的分布情况;得到公式f(n)=f(1)f(n-1)+f(2)f(n-2)+...+f(i)f(n-i)+...+f(n-1)f(1). 复杂度为O(n^2),不仅复杂度不低,而且实现较复杂,递归时还得用额外的空间记录已经计算过的值。
现在从另一个角度分析。先假设取一个最小结点单位(即一个结点下接两个叶子)。 然后构造一棵含有n-1个叶子的完全二叉树;再将刚提到的最下结点单位替换n-1个叶子中的任何一个,就是一棵含有n个叶子的完全二叉树,这种情况的方案数为f(2)f(n-1)*(n-1)。 以此类推所有情况可得出n个叶子的完全二叉树方案数有:f(2)f(n-1)*(n-1)+f(3)f(n-2)*(n-2)+...+f(i)f(n-i+1)*(n-i+1)+...+f(n-1)f(2)*2。 把首尾合并得:f(2)f(n-1)*(n+1)+f(3)f(n-2)*(n+1)+...+f(i)f(n-i+1)*(n+1) | i<=n/2. 但这并不是正确的f(n)公式,因为没有去除重复的情况。 在n>3时这个式子是一定只有n-2项的(指没首尾合并前),而每一项的情况都会在其他的n-3项中重复一次(如果不清楚可以实际画f(4)或f(5)的情况看下)。 所以要除以重复的n-2。 那么最终得到公式f(n)=[f(2)f(n-1)+f(3)f(n-2)+...+f(i)f(n-i+1)]*(n+1)/(n-2) | i<=n/2。
现在看会最开始的那个公式,将n+1代入得:f(n+1)=f(1)f(n)+f(2)f(n-1)+...+f(i)f(n-i+1)+...f(n)f(1)。 去掉首尾的f(1)f(n)和f(n)f(1)。中间的这个式子,正好就是后面推的f(n)公式大括号部分的“一半”。将该部分乘以二则有f(2)f(n-1)+...+f(i)f(n-i+1)+...+f(n-1)f(2)=f(n)*2(n-2)/(n+1)。 由f(1)=1,所以f(n+1)=2f(n)+f(n)*2(n-2)/(n+1). 最后化简得到公式f(n)=f(n-1)*(4n-6)/n.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
using namespace std;
typedef long long ll; ll catalan(int n)
{
if(n==)return ;
return catalan(n-)*(*n-)/n;
}
int main()
{
int n;
scanf("%d",&n);
printf("%lld\n",catalan(n));
return ;
}
11082 完全二叉树的种类 O(n) 卡特兰数的更多相关文章
- Buy the Ticket HDU 1133 卡特兰数应用+Java大数
Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...
- HDU 6084 寻找母串(卡特兰数)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6084 [题目大意] 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)
题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- 卡特兰数(Catalan)
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...
- NOIP2003pj栈[卡特兰数]
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...
- 卡特兰数 (Catalan)
卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1. 或 2. 递归公式: 1. 或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k- ...
- HDU 5673 Robot ——(卡特兰数)
先推荐一个关于卡特兰数的博客:http://blog.csdn.net/hackbuteer1/article/details/7450250. 卡特兰数一个应用就是,卡特兰数的第n项表示,现在进栈和 ...
随机推荐
- [ CodeForces 1063 B ] Labyrinth
\(\\\) \(Description\) 给出一个四联通的\(N\times M\) 网格图和起点.图中有一些位置是障碍物. 现在上下移动步数不限,向左至多走 \(a\) 步,向右至多走 \(b\ ...
- 全志A33平台编译linux(分色排版)V1.1
全志A33平台编译linux 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/13 10:41 版本:V1.1 (一)解压缩lichee备用 ...
- 【笔记JS/HTML/CSS】CSS3实现鼠标滑动显示动画(transition、transform)
内容中包含 base64string 图片造成字符过多,拒绝显示
- codeforces_333B_水过
B. Chips time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- HDU_1506_Largest Rectangle in a Histogram_dp
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 梦想CAD控件网页版标注样式
增加标注样式 _DMxDrawX::AddDimStyle 增加一个新的标注样式,如果当前已经有指定名的标注样式,就直接失败返回.详细说明如下: 参数 说明 BSTR pszName 新增加的标注样式 ...
- TWaver动画之雷达扫描效果
UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上的设计,而忽略了UI.在这个“看脸”的时代,就算产品的功能很强大,如果UI跟不上步伐,你的产品都会在客户心中大打折扣.做安全和监控的项目中经 ...
- UVA - 10723 Cyborg Genes (LCS)
题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果s[i-1]==t[j-1]就有dp[i][j] = dp[i-1][j ...
- MyBatis 的基本要素—核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyB ...
- CentOS7.x的DNS服务的基础配置
一.bind服务器安装 bind:开源.稳定.应用广泛的DNS服务.bind的软件包名bind,服务名称named. 查看是否安装bind, 安装bind包: rpm -qa bind yum -y ...