1.卡特兰数Catalan
其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ..原理
h(0)=1,h(1)=1;
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
另类递推式:
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)
运用:
1.一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
2.凸多边形三角划分。
3.给定节点组成二叉树。
2.康托展开
有一个序列,长度为n,其所有元素都不相同,为了便于哈希,我们将其转换成0~n!的值,表示序列在所有排列中的位置。
int hash[9]={1,1,2,6,24,120,720,5040,40320};
int get_hash(string e)//获得hash值,倒着来,不过效果一样,我们只是用于标识唯一性
{
int s=0,i,j,k;
for(i=0;i<9;i++)
{
k=0;
for(j=0;j<i;j++)
if(e[j]>e[i])k++;
s+=k*hash[i];
}
return s;
}
2.勾股数
勾股数,又名商高数或毕氏三元数(Pythagorean triple),是由三个正整数组成的数组;能符合勾股定理(毕式定理)“a^2 + b^2 = c^2 ”之中, (a, b, c) 的正整数解。而且,基于勾股定理的逆定理,任何边长是勾股数组的三角形都是直角三角形。
勾股数举例:
(3,4,5)
(5,12,13)
(6,8,10)
(7,24,25)
(8,15,17)
(20,21,29)
如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数,即 (na, nb, nc) 也是勾股数。若果 a, b, c 三者互质(它们的最大公因数是 1),它们就称为素勾股数。
以下的方法可用来找出勾股数。设 m > n 、 m 和 n 均是正整数,
a = m^2 − n^2,
b = 2*m*n,
c = m^2 + n^2
若 m 和 n 是互质,而且 m 和 n 其中有一个是偶数,计算出来的 a, b, c 就是素勾股数。(若 m 和 n 都是奇数, a, b, c 就会全是偶数,不符合互质。)
3.抛针问题
问题介绍:将凸包放在一个充满间距为D的平行线的平面上,求其与直线相交的概率
P=L/(πD)。其中L为凸包的周长。
过程:
一条边放在这个平面上的概率是Pi=2Li/(πD)(抛针问题的结论)
P=1/2∑Pi=L/(πD)。