poj 1095 题解(卡特兰数+递归
题意:给出一个二叉树的编号,问形态。
编号依据
1:如果二叉树为空,则编号为0;
2:如果二叉树只有一个节点,则编号为1;
3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编号;
4:如果一棵含有m个节点的二叉树(左子树为L,右子树为R)的编号为n,要想其它含有m个节点的二叉树的编号如果大于n,则需要满足两个条件中的任意一个:1、左子树的编号大于L的左子树的编号等于L的编号,但是右子树的编号大于R的编号。(大概就是先将右子树的个数填满将变幻完后再将右子树的点向左子树转移
一道卡特兰数的题。。总的来说代码难度不高,但是思维难度还是挺高的,首先二叉树形态有几种就很想然得想到用卡特兰数啦。
递推公式
$ cat[i]=cat[i-1]* ( 4 * i-2)/(i+1) \ \ \ \ \ cat[1]=1,cat[0]=1 $
不了解的自行百度卡特兰数
我们首先可以设一棵二叉树可能的形态种类数为 $ f[n] $ 那么对于左子数所含有的节点数 $ 0<=i<=n-1 $ 都有 $ f[n]= \sum_{i = 0}^{n-1}\ f[i] * f[n-i-1] $
首先我们设当前含有x个节点的二叉树第order个排序通给定数 $ n $ 计算出当前有几个节点并且当前是第几个排序 $ order=n-Catalan(0)+Catalan(1)+...+Catalan(i-1)) \ \ \ \ (Catalan(i)>=n)) $
然后我们再去考虑二叉树中左子树有多少个节点,右子树有多少节点。由题意知初始状态下,左子树为空,所有的节点均在右子树上并且所有节点只有右孩子,随着右子树的变化完后,右子树拿一个节点到左子树,然后再变化。这个过程就像时钟一样,右子树是分钟,左子树是时针,右子树的变化走满了,就开始进位,然后左子树再变化。当然这里使用的进制当然就是卡特兰数进制呀。然后只要算出左右此时的节点个数以及是第几个排序。之后层层递归下去即可。
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=500000010;
int n;
long long cat[40],sum[40];
void star(){
cat[0]=cat[1]=1;
for(int i=2;i<35;++i){
cat[i]=cat[i-1]*(4*i-2)/(i+1);
}
return;
}
void find(int x,int order){
if(x==1){
printf("X");
return;
}int i,cnt=0;
for(i=0;cnt<order;i++){//保证左子树尽可能小
cnt+=cat[i]*cat[x-i-1];
}i--;
int l=i,r=x-l-1;
int neworder=order-(cnt-cat[l]*cat[r]);//减去其中的个数
if(l>0){
printf("(");
find(l,(neworder-1)/cat[r]+1);//减一然后在后面加一相当于判断是否有余数,有余数加一
printf(")");
}printf("X");
if(r>0){
printf("(");
find(r,(neworder-1)%cat[r]+1);//同上
printf(")");
}
}
int main(){
star();
while(scanf("%d",&n)&&n){
int i,cnt=0;
for(i=1;cnt<n;++i){
cnt+=cat[i];
}i--;
find(i,n-(cnt-cat[i]));
printf("\n");
}
return 0;
}
poj 1095 题解(卡特兰数+递归的更多相关文章
- HDU-4828 卡特兰数+带模除法
题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数 ...
- poj 1095 Trees Made to Order 卡特兰数
这题用到了卡特兰数,详情见:http://www.cnblogs.com/jackge/archive/2013/05/19/3086519.html 解体思路详见:http://blog.csdn. ...
- FZU 1064 教授的测试(卡特兰数,递归)
Problem 1064 教授的测试 Accept: 149 Submit: 364 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Des ...
- [SCOI2010]生成字符串 题解(卡特兰数的扩展)
[SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- [AHOI2012]树屋阶梯 题解(卡特兰数)
[AHOI2012]树屋阶梯 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营. ...
- [NOIP2003]栈 题解(卡特兰数)
[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序 ...
- POJ 2084 Game of Connections 卡特兰数
看了下大牛们的,原来这题是卡特兰数,顺便练练java.递归式子:h(0)=1,h(1)=1 h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) ( ...
- POJ 2084 Game of Connections(卡特兰数)
卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… ...
随机推荐
- robot framework设置更高级别的关键字
robot framework中除了内置的关键字,以及低级别的用户自定义关键字外,为了使用例更加整洁,我们还可以形成更高级别的关键字 方法如下: 在Keywords里面设置 其中Run Success ...
- 学习Spring-Data-Jpa(十三)---动态查询接口JpaSpecificationExecutor
1.JpaSpecificationExecutor JPA2引入了一个criteria API,我们可以使用它以编程的形式构建查询.通过编写criteria,动态生成query语句.JpaSpeci ...
- CentOS7下安装Python3和PIP3
为了方便以后编译,所以整合了下配置流程 先查看是否安装了Python3 python3 -V 如果没有安装,则先安装依赖包 yum install zlib-devel bzip2-devel ope ...
- 图书检索系统C版本
原创,转载请注明出处! 程序具有一下功能窗口界面1,Input输入(读入文件,所有的文件都读入)2,Output输出(检验是否读取正确,从结构体数组读入)3,Length统计(此文件里有110本图书) ...
- Redis存储字符串
1.set和get实现字符串存取: 键的名字相同,会对以前的值进行覆盖: 2.++操作: 3.--操作: 4.加任意数值的数字: 5.减任意数值的数字: 6.拼接字符串: 7.删除:
- Lightning Web Components html_templates(三)
Lightning Web Components 强大之处在于模版系统,使用了虚拟dom 进行智能高效的组件渲染. 使用简单语法以声明方式将组件的模板绑定到组件的JavaScript类中的数据 数据绑 ...
- GoCN每日新闻(2019-10-16)
GoCN每日新闻(2019-10-16) GoCN每日新闻(2019-10-16) 1. 持续的性能分析与优化 https://medium.com/@tvii/continuous-profilin ...
- React_02_ECMAScript6
1.let与const ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const. let 声明的变量只在 let 命令所在的代码块内有效,const 声明一 ...
- 程序日志-应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户 NT AUTHORITY\SYSTEM SID (S-1-5-18)授予针对 CLSID 为 {D63B10C5-BB46-4990-A94F-E40B9D520
应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户 NT AUTHORITY\SYSTEM SID (S-1-5-1 ...
- plsql 如何导入excel数据?
oracle 导入excel数据? 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构字段一 一对应 下面以tdoctor_apply表为例,进行演示 表结构 Excel表数据 ...