卡特兰数

“我经常有那种感觉,如果这个事情来了,你却没有勇敢地去解决掉,它一定会再来。生活真是这样,它会一次次地让你去做这个功课直到你学会为止。” —— 《像我这样笨拙地生活》

卡特兰数(Catalan number)是 组合数学 中一个常出现在各种 计数问题 中的 数列。

​数列的前几项为:1,1, 2, 5, 14, 42, 132, 429, 1430, 4862,...

题目描述:

n 个元素进栈序列为:1,2,3,4,...,n,则有多少种出栈序列。

思路:

我们将进栈表示为 +1,出栈表示为 -1,则 1 3 2 的出栈序列可以表示为:+1 -1 +1 +1 -1 -1。

假设非法序列为 A,对应的序列为 B。每个 A 只有一个"第一个前缀和小于 0 的前缀",所以每个 A 只能产生一个 B。而每个 B 想要还原到 A,就需要找到"第一个前缀和大于 0 的前缀",显然 B 也只能产生一个 A。

#include <cstdio>
using namespace std;
long long catalan[1000005];
int main()
{
    int n;
    scanf("%d", &n);
    catalan[0] = catalan[1] = 1;
    for (int i = 2; i <= n; i++)
        for (int j = 0; j <= i - 1; j++)
            catalan[i] += catalan[j] * catalan[i - j - 1];
    printf("%lld\n", catalan[n]);
    return 0;
}

  我有罪,从此与省二失之交臂。这一次就是在赛场上没认出来。关于括号的排列组合,在使劲想转移方程,卡了3h。

原文地址:https://www.cnblogs.com/thx2199/p/15627832.html