01卡特兰数

卡特兰数跟排列组合很有关系,所以在看此文章前请掌握:

  • 加法原理
  • 乘法原理
  • A(m,n)计算公式及其原理
  • C(m,n)计算公式及其原理

前言

今天您将会学习到基本的卡特兰数及其应用。


一、卡特兰数是什么?

        卡特兰数(Catalan number)是组合数学中一种常出现于各种计数问题中的数列。其前几项为: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(n)为catalan数的第n项,令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+1)=h(n) * (4*n + 2) / (n + 2)

递推关系的解为:

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.思路分析

您可以先看这一题。

现在我们来思考这道题:

首先,我们设 f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原理,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。)

首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。

此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的 f(n) =f(k-1) × f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n) = f(0)f(n-1) + f(1)f(n-2) + …… + f(n-1)f(0)。

2.我的打表代码
#include
using namespace std;
long long a[18]={1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700};
int main(){
    int x;
    cin>>x;
    cout<

四、AI说的话

1.AI对卡特兰数的评价

卡特兰数是一种非常重要的组合数学概念,它在许多领域都有广泛应用。下面是对卡特兰数的一些评价:

1. 卡特兰数可以表示组合问题和路径计数问题。

2. 卡特兰数的计算方法简单明了,可通过递推公式或生成函数求解。

3. 卡特兰数的性质丰富,涉及到二叉树、括号序列、山峰序列等多种组合结构。

4. 卡特兰数常被用于解决实际问题,如括号匹配、高维几何计算等。

5. 卡特兰数还具有一些意想不到的应用,如计算有限自动机、判断合法的棋盘布局等。

总之,卡特兰数作为组合数学中的重要概念,不仅具有理论意义,更有着实际应用价值。

2.AI解释卡特兰数的应用

卡特兰数是一类非常重要的数列,因为它们可以用于解决许多实际应用问题。以下是卡特兰数的一些应用:

  1. 括号序列:一个括号序列是由左右括号组成的字符串,例如 (()())。卡特兰数可以用于计算长度为n的括号序列的数量,以及其中合法的括号序列的数量。

  2. 凸多边形三角剖分:在凸多边形中,任何三角形的划分都可以由其对角线进行。卡特兰数可以用于计算划分凸多边形所需的对角线数量。

  3. 二叉树:卡特兰数也可以用于计算由n个节点构成的二叉树的数量。这里,每个节点不仅包含一个值,而且还包含指向其左子节点和右子节点的指针。

  4. 杨表:卡特兰数也可以用于计算n个数的杨表的数量,其中杨表是一种将n个数排列成不降序列的方案。

  5. 格路线:在一个n×n的网格上,从左下角到右上角的路径必须从每个格子的下方或右方穿过。卡特兰数可以用于计算这样的路径的数量。

  6. 栈的操作序列:假设我们有一个空栈,我们可以将n个数字插入该栈。卡特兰数可以用于计算所有n个数字的操作序列的数量,其中每个操作可以是“压入”或“弹出”。

  7. 电力分配:假设我们有n台发电机和n个城市,每台发电机都可以向多个城市提供电力。卡特兰数可以用于计算所有可能的电力分配方案。

总之,卡特兰数在组合数学中起着非常重要的作用,它们的应用广泛,不仅仅限于上述问题。

3.AI生成的卡特兰数C++代码

以下是使用C++语言生成卡特兰数的示例代码:

#include 
using namespace std;

unsigned long int catalanDP(unsigned int n)
{
    // Table to store precomputed values of catalan numbers
    unsigned long int catalan[n + 1];

    // Initialize first two values in table
    catalan[0] = catalan[1] = 1;

    // Fill entries in catalan[] using DP
    for (int i = 2; i <= n; i++)
    {
        catalan[i] = 0;
        for (int j = 0; j < i; j++)
            catalan[i] += catalan[j] * catalan[i - j - 1];
    }

    // Return last entry
    return catalan[n];
}

int main()
{
    for (int i = 0; i < 10; i++)
        cout << catalanDP(i) << " ";
    return 0;
}

此示例代码使用动态规划方法来计算卡特兰数,并使用循环生成前10个卡特兰数。


总结

以上就是今天要讲的内容。

你可能感兴趣的:(学习笔记,学习,c++)