首页 > 其他分享 >卡特兰数 Catalan 数列

卡特兰数 Catalan 数列

时间:2023-10-20 12:14:25浏览次数:34  
标签:方案 出栈 数列 路径 Catalan 2n 卡特兰

卡特兰数 Catalan 数列

引入

有一个无限大的栈,进栈的顺序为 \(1,2,\cdots,n\),求有多少种不同的出栈序列。

设 \(h[n]\) 为 \(n\) 个数的出栈序列方案数。

可以这样想 \(k\) 是最后一个出栈的数,那么比 \(k\) 早进栈早出栈的有 \(k-1\) 个,方案数也就是 \(h[k-1]\)。同理比 \(k\) 晚进栈早出栈的方案数就是 \(h[n-k]\),那么 \(k\) 作为最后一个出栈的数贡献的方案数为 \(h[k-1]h[n-k]\)。

由于 \(1\) 到 \(n\) 中任何一个数都可以成为 \(k\),那么 \(h[n]\) 的方案数就是 \(h[n]=\sum_{i=1}^n h[i-1]h[n-i]\)。

\(h\) 就是卡特兰数列。

应用问题

  • 1.有 \(2n\) 个人排队买票,票 \(5\) 元一张。有 \(n\) 个人有 \(5\) 元钞票,另外 \(n\) 个人有 \(10\) 元钞票,售票处没有其它钞票,求有多少种排队顺序不会使售票处无法找零。

    分析:每一个 \(10\) 元的钞票都需要一个 \(5\) 元的钞票,不妨把 \(5\) 元看成进栈 \(10\) 元看成出栈,每一种出栈序列对应一种排队方案,问题变为引入问题,答案为 \(h[n]\)。

  • 2.学校在坐标 \((n,n)\) 处,每天彬彬上学会从 \((0,0)\) 出发,向 \(x\) 轴正方向走 \(n\) 步,向 \(y\) 轴正方向走 \(n\) 步,求不穿过(可以碰到)\((n,n)\) 与 \((0,0)\) 对角线(即直线 \(y=x\))的路径数(只走直线 \(y=x\) 下方)。

    分析:如果想不穿过对角线那么可以移动看做进栈和出栈。如上题,一种出栈序列对应一种路径方案,答案为 \(h[n]\)。

总结:对于一些问题,可以转换成不同出栈序列的问题,那么便可以由卡特兰数得到。

  • 3.有一个 \(n\) 条边的凸多边形,用直线连接对角线,使该多边形分为多个三角形,每条直线不相交,问有多少种划分方法。

    分析:我们先将多边形顺序编号 \(p_1,p_2,\cdots,p_n\),选择基边 \(p_1p_n\),再任选一个点 \(p_k\ (2\leq k \leq n-1)\),连接 \(p_1p_k,p_np_k\),这样(除连接的三角形外)将多边形重新分为了一个 \(k\) 边型和 \(n-k+1\) 边型,那么设 \(f[n]\) 为 \(n\) 边型的答案,有 \(f[n]=\sum_{i=1}^n h[i-1]h[n-i]\)。这正是卡特兰数的递推公式。

  • 4.圆环上有 \(2n\) 个点,求点成对连接,线段不相交的方案数。

    分析:和上述一样,选择后点对后会分为两部分,将两部分独立处理即可。

总结:如果一个问题可以通过枚举来分为两部分,通过乘法和加法原理得到相同的递推式,那么也是卡特兰数列。在做题中,我们可以先设 \(dp\) 在推式子,得出 \(dp\) 的递推公式,再来判断卡特兰数;或者先看能否分为两部分,再推式子。

公式

使用应用问题 \(2\) 推导:

先不管不管对角线限制,从 \((0,0)\) 到 \((n,n)\) 的路径数为 \(C_{2n}^n\)。

在减去穿过对角的路径数,即减去触碰到 \(y=x+1\) 的直线的路径数。

把一条路径碰到 \(y=x+1\) 之前的路径以 \(y=x+1\) 为对称轴翻转,发现每次的起点都变成 \((-1,1)\)。

图中黄线为原触碰 \(y=x+1\) 的路径,灰色为关于 \(y=x+1\) 翻折的部分。

那么不合法线段的选择数就是从 \((-1,1)\) 走到 \((n,n)\) 的方案数。(无论怎么走都会触碰红线)

那么合法的方案数就是 \(总方案数-不合法方案数\),即 \(h[n]=C_{2n}^n-c_{2n}^{n-1}\)。

化简后变得到了 \(h[n]\) 的递推式,\(h[n]=C_{2n}^n-C_{2n}^{n-1}=\frac{C_{2n}^n}{n+1}\)。

标签:方案,出栈,数列,路径,Catalan,2n,卡特兰
From: https://www.cnblogs.com/binbinbjl/p/17776763.html

相关文章

  • 递归之斐波那契数列,爬楼梯问题
    什么是递归呢?一个大的问题f(n)可以被拆解为小一点的问题f(n-1)和f(n-2),……直到然后拆到最小的问题f(1)和f(2)。很多人把从大往小算的形式称作递归我们用一个题目引入:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以......
  • 计算整数列表中的中位数
    在计算机科学和数据分析领域,计算整数列表中的中位数是一项非常重要的任务。中位数是一组数据中排在中间位置的数值,对于理解数据分布和预测数据趋势具有重要意义。本文将介绍如何使用Python语言来计算整数列表中的中位数,并详细阐述相关实现过程和优缺点。一、解决问题的方法要计算整......
  • 浅析斐波那契数列在代码中的应用
    byemanjusakafrom​https://www.emanjusaka.top/archives/9彼岸花开可奈何本文欢迎分享与聚合,全文转载请留下原文地址。前言斐波那契数列在代码中的应用是比较常见的,下面让我们来了解下一个数学上的数列在代码中会有哪些应用。了解斐波那契,可以给我们提供解决某些问题的......
  • 斐波那契数列二项式
    在阅读CSDN时看到的。对于\(Fibonacci\)数列。存在\(Fibonacci_{2n}=Fibonacci_n\times(Fibonacci_{n-1}+Fibonacci_{n+1})\)。证明:我们知道\(Fibonacci\)有一个这个东西。\(\begin{bmatrix}f_{2n+1}&f_{2n}\\f_{2n}&f_{2n-1}\end{bmatrix}=\begin{......
  • 无聊的数列
    P1438无聊的数列我们考虑原数列\(a\)的差分序列\(b\)。\(b_l\leftarrowb_l+k,b_{r+1}\leftarrowb_{r+1}-k\),将区间\([l,r]\)内的数增加\(k\)。\(l<i\ler,b_i\leftarrowb_i+d,b_{r+1}\leftarrowb_{r+1}+(l-r)d\),将区间\([l+1,r]\)内的数增加按照等差数列增长......
  • P1667 数列
    原题可能更好的阅读体验区间操作的维护看起来很麻烦,考虑转为点操作的维护。题目中的\(\sum_{i=l}^ra_i\)启发我们用前缀和。那么我们考虑每次操作会对前缀和数组\(s\)造成怎样的变化。设操作区间为\([l,r]\),按照题意,会把\(a_{l-1}\)和\(a_{r+1}\)加上\(S\),\(a_l\)和......
  • 斐波那列数列的讲解过程
    python案例解释的有点不好,多多包含deff1(n):ifn<=2:return1;else:returnf1(n-1)+f1(n-2)#print(f1(6))"""示例1解释一下他是如何等8的,递归不是直接返回值再去传递给自身函数,比如n=4的时候,那么f1(4-1)+f1(4-2)=f1(3)+f1(2)不是......
  • 算法:打印斐波那契数列的前30项(JS)
    打印斐波那契数列的前30项提示:斐波那契数列的前两项是1,其他项是之前两项之和1functionfibonacciIterative(n){2if(n<=0){//如果输入的n小于等于0,表示输入错误,返回错误提示3return"输入错误,请输入正整数";4}5leta=1;//初始化......
  • P3901 数列找不同 【莫队】
    P3901数列找不同莫队:一种离线处理的优化暴力解法,时间复杂度在n*n^(1/2),会被卡常数,但是极为简单推荐视频:莫队算法点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N];intpos[N];structnode{ intl,r,k;}t[N];strings......
  • 关于斐波那契数列 - 2 (平方的和)
    令斐波那契数列的第\(i\)项定义为\(b_i\)。再令\(f_n=\underset{i=1}{\overset{n}{\sum}}b^2_i\)结论:\(f_n=b_n\timesb_{n+1}\)首先,不难发现,该结论对于\(n=1\)和\(n=2\)一定是成立的\[f_1=1=1\times1\]\[f_2=1+1=2=1\times2\]......