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) 卡特兰数的更多相关文章

  1. Buy the Ticket HDU 1133 卡特兰数应用+Java大数

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  2. HDU 6084 寻找母串(卡特兰数)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6084 [题目大意] 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种 ...

  3. [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

    本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...

  4. [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)

    题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ ...

  5. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  6. 卡特兰数(Catalan)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...

  7. NOIP2003pj栈[卡特兰数]

    题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...

  8. 卡特兰数 (Catalan)

    卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1.         或       2.   递归公式: 1.  或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k- ...

  9. HDU 5673 Robot ——(卡特兰数)

    先推荐一个关于卡特兰数的博客:http://blog.csdn.net/hackbuteer1/article/details/7450250. 卡特兰数一个应用就是,卡特兰数的第n项表示,现在进栈和 ...

随机推荐

  1. js 获取json数组里面数组的长度

    作为一个前端页面开发者第一次处理json数据,遇到了‘js 获取json数组里面数组的长度’?竟然不知道 json没有.length属性(真是要嘲讽下自己),少壮不努力老大徒伤悲啊!以前都是去寻求男朋 ...

  2. Microsoft SQL Server学习(五)--操作符聚合函数

    算术运算符 逻辑运算符 比较运算符 聚合函数 算术运算符(+ - * / ) select score*2 as 成绩翻倍 from class_A update class_A set score= ...

  3. UI/UE/ID/UED/UCD的区别(转)

    对于刚刚接触用户体验交互设计的同学来说,很多云里雾里的英文缩写,分不清各个概念代表着什么含义,今天给大家做一个简单地介绍. 简述: UI (User Interface):用户界面 UE或UX (Us ...

  4. 并发和多线程(六)--ThreadLocal

    ThreadLocal是什么? 当使用ThreadLocal修饰变量的时候,ThreadLocal会为每个使用该变量的线程提供独立的变量副本,每个线程可以独立改变自己的副本,而不 影响其他线程的变量副 ...

  5. Manjaro安装配置美化字体模糊发虚解决记录

    Manjaro安装记录 前言: ​ 记录自己Manjaro18安装的一些坑,避免下次满互联网找解决方法.在此之前试过Manjaro.Ubuntu.Fedora.linux Mint系统的pac.yum ...

  6. ArrayList经典Demo

    import java.util.ArrayList; import java.util.Iterator; public class ArrayListDemo { public static vo ...

  7. Error LNK2019: unresolved external symbol C++模板类声明与定义链接错误问题

    编译器在编译模板时,并不会生成代码,只有遇到实例化的时候才会生成代码.因此,当我们只引用模板声明文件的时候,在实例化的对象时候,模板的定义问文件是不可见的,于是出现链接错误.例如: //A.h #pr ...

  8. Luogu P1692 部落卫队

    解题思路 数据范围不是很大,那应该不是那些普遍的图论的算法.考虑搜索,用暴力解决.从1到N枚举每一个点的位置,搜索这个点事选还是不选.如果在这个点之前选到的点中又和他冲突的点,那就不选,要么就选. 附 ...

  9. Djang学习笔记-1

    1.django的生命周期: url匹配 -> 视图函数 -> 返回用户字符串 url匹配 -> 视图函数 -> 打开一个HTML文件,并读取内容2.创建Django proj ...

  10. js之字典操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...