算法-数论-卡特兰数
2015-08-29 00:41
225 查看
卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式 :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)
应用
1.括号化
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,
试问有几种括号化的方案?(h(n-1)种)
2.出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
3.凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。
任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
4.给定节点组成二叉树
给定N个节点,能构成多少种不同的二叉树?(能构成h(N)个,这个公式的下标是从h(0)=1开始的)
以下是这两种递推关系求卡特兰数
令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式 :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)
应用
1.括号化
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,
试问有几种括号化的方案?(h(n-1)种)
2.出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
3.凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。
任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
4.给定节点组成二叉树
给定N个节点,能构成多少种不同的二叉树?(能构成h(N)个,这个公式的下标是从h(0)=1开始的)
以下是这两种递推关系求卡特兰数
#include<stdio.h> int main(){ int n,i,catalan=1,itme=1; scanf("%d",&n); for(i=1;i<=n;i++) { itme=catalan*(4*i-2)/(i+1); catalan=itme; } printf("%d\n",catalan); return 0; }
#include<stdio.h> int com(int n, int r) { long long i,j,s=1; if(n-r>r) r=n-r; for(i=0,j=1;i<r;i++) { s*=(n-i); for(;j<=r&&s%j==0;j++) s/=j; } return s; } int main(){ int n; long long catalan=0; scanf("%d",&n); catalan=com(2*n,n)-com(2*n,n+1); printf("%d\n",catalan); return 0; }
相关文章推荐
- php5.4 的 arm 交叉编译
- Python单元测试框架之pytest -- 生成测试报告
- Gmail打不开登录不了邮箱最新解决方法!
- the differences between Server.Transfer and Response.Redirect
- android Studio so的加载
- memcached缓存集群搭建
- Swift - 基础部分
- usaco Superprime Rib
- C加密解密
- DRBD+keepalived+LAMP+discuz
- [leetcode] 86.Partition List
- Java 反射
- unity3d中摄像机父物体与模型碰撞
- 算法-完全二叉树的最大宽度和高度
- Java集合之WeakHashMap
- Java集合之WeakHashMap
- [leetcode-179]Largest Number(java)
- Java-WeakHashMap源码分析及示例
- 侦查
- [leetcode]] 82.Remove Duplicates from Sorted List II