套碗游戏的取碗顺序问题 | 豆包MarsCode AI刷题

154 阅读3分钟

问题描述

小F正在玩一个套碗的游戏,每个碗都有一个编号,从1到n,它们从大到小被套在一根木棍上。小F只能从木棍上取最上面的碗,每次只能取一个。现在你需要计算总共有多少种取碗的顺序。

例如,对于2个碗,取碗的顺序可以是 2 1 或 1 2,这两种顺序都是合法的。而对于3个碗,给定顺序 3 1 2 不可能通过合法操作实现,因此该顺序不可行。

问题本质

本题是一个关于合法序列的组合问题,核心是计算所有满足从顶部依次取碗规则的顺序总数。问题本质与卡塔兰数相关。


约束条件

  1. 碗的编号为 1,2,…,n1, 2, \dots, n1,2,…,n,且从大到小套在木棍上。

  2. 每次只能取最上面的碗。

  3. 取碗的顺序必须保持合法:即被取出的碗,后续编号必须比先前取出的碗编号更大。

    • 比如,对于 n=3n = 3n=3,顺序 3 1 2 不可能通过合法操作完成,因为 2 无法在 1 之前取出。

建模问题

该问题可以转化为一个栈操作问题

  • 可以将套碗的过程等价于:从一个栈中依次弹出元素,并将弹出的顺序记录下来。
  • 要求计算所有满足「栈操作顺序合法」的可能弹出序列。

合法性条件可以归纳为:

  • 栈的操作(进栈和出栈)必须保证在某个时间点,如果一个碗还未被取出,那么比它大的碗也不能被取出。

与卡塔兰数的关系

上述条件完全符合卡塔兰数问题的定义,即:

  • 给定 nnn 个元素,计算所有满足某种递归性质的序列数。

  • 卡塔兰数的递归定义: Cn+1=∑i=0nCi⋅Cn−iC_{n+1} = \sum_{i=0}^n C_i \cdot C_{n-i}Cn+1​=i=0∑n​Ci​⋅Cn−i​ 其中:

    • C0=1C_0 = 1C0​=1 是基础情况。

卡塔兰数的直观解释

对于 n=4n = 4n=4,所有合法的取碗序列数为:

C4=合法的取碗顺序数C_4 = \text{合法的取碗顺序数}C4​=合法的取碗顺序数

例如:

  • 对于 n=2n = 2n=2:合法顺序为 [2, 1] 或 [1, 2],共 2 种。
  • 对于 n=3n = 3n=3:合法顺序有 [3, 2, 1]、[3, 1, 2]、[2, 3, 1]、[2, 1, 3]、[1, 2, 3],共 5 种。

扩展 :卡塔兰数 (Catalan Number) 简介

卡塔兰数是一组出现在许多组合数学问题中的自然数序列。它在解决具有递归性质或结构化限制的排列问题时起着重要作用。


定义

卡塔兰数的第 nnn 项 CnC_nCn​ 可以通过以下递推公式或显式公式计算:

1. 递推公式

C0=1,Cn+1=∑i=0nCi⋅Cn−iC_0 = 1, \quad C_{n+1} = \sum_{i=0}^n C_i \cdot C_{n-i}C0​=1,Cn+1​=i=0∑n​Ci​⋅Cn−i​

2. 显式公式 (组合数形式)

Cn=1n+1(2nn)=(2n)!(n+1)!⋅n!C_n = \frac{1}{n+1} \binom{2n}{n} = \frac{(2n)!}{(n+1)! \cdot n!}Cn​=n+11​(n2n​)=(n+1)!⋅n!(2n)!​

其中 (2nn)\binom{2n}{n}(n2n​) 是组合数,表示从 2n2n2n 个元素中选出 nnn 个的方法数。


前几项卡塔兰数

根据递推公式或显式公式,可以计算出卡塔兰数的前几项:

C0=1, C1=1, C2=2, C3=5, C4=14, C5=42, C6=132,…C_0 = 1, , C_1 = 1, , C_2 = 2, , C_3 = 5, , C_4 = 14, , C_5 = 42, , C_6 = 132, \ldotsC0​=1,C1​=1,C2​=2,C3​=5,C4​=14,C5​=42,C6​=132,…