hdu1100
来源:互联网 发布:无线信道检测软件 编辑:程序博客网 时间:2024/05/19 22:51
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int n,op[40],sum[40];void init(){ memset(op,0,sizeof(op)); op[1]=sum[1]=1;op[0]=1;sum[0]=0; for(int i=2;i<20;i++) { for(int j=0;j<i;j++) op[i]+=op[i-1-j]*op[j]; sum[i]=sum[i-1]+op[i]; }}void dfs(int n){ if(n==0) return ; int num=lower_bound(sum,sum+19,n)-sum; num--; n-=sum[num]; int nl=0; while(n>op[nl]*op[num-nl]) { n-=op[nl]*op[num-nl]; nl++; } int dt=0,lp=1; if(nl) { dt=1+(n-1)/op[num-nl]; n-=(dt-1)*(op[num-nl]); printf("("); dfs(dt+sum[nl-1]); printf(")"); } printf("X"); if(num-nl) { printf("("); dfs(n+sum[num-nl-1]); printf(")"); }}int main(){ init(); while(cin>>n&&n) { dfs(n);printf("\n"); } return 0;}We can number binary trees using the following scheme:
The empty tree is numbered 0.
The single-node tree is numbered 1.
All binary trees having m nodes have numbers less than all those having m+1 nodes.
Any binary tree having m nodes with left and right subtrees L and R is numbered n such that all trees having m nodes numbered > n have either
Left subtrees numbered higher than L, or
A left subtree = L and a right subtree numbered higher than R.
The first 10 binary trees and tree number 20 in this sequence are shown below:
Your job for this problem is to output a binary tree when given its order number.
此题刚开始看的时候以为是个树,其实这是一个数学问题,此题的递推规则其实和卡特兰数十分相似。
每次先对n计算有多少nodes,然后减掉多余的求出在这么多nodes的条件下的排列序号,此时再根据卡特兰数的递推公式可以轻松的求出左右子数的个数是多少,然后便是求解左树子排列序号以及右树子的排列序号,从而可以使用dfs完美求解
0 0
- hdu1100
- hdu1100
- pku1095&&hdu1100
- hdu1100 Trees Made to Order
- hdu1100:Trees Made to Order
- hdu1100(二叉树形状)
- KD树在knn算法中的应用
- poj 1469 COURSES 【匈牙利匹配】
- HDU 4570 简单的DP
- Floyd-Warshall算法---求解任意两节点的最短路径
- 14级俱乐部成员
- hdu1100
- 安装CentOS7后修复windows开机启动项
- Linux值OSS的Mixer编程
- hibernate中的session介绍
- 程序猿必备
- 多线程01-NSThread 基本了解和一些总结1
- 看代码
- adb shell screenrecord /sdcard/myscreenrecord.mp4 录视频
- Qt 5.5 beta - Qt Quick Extras - CircularGauge