当前位置:   article > 正文

【C++】栈的运用——卡特兰数_c++ 卡特兰数

c++ 卡特兰数

1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 依次入栈,可能的出栈序列有多少种?

我们来模拟一下就知道了。

考虑 4 4 4 最先出栈,那么就只有 4321 4321 4321 这一种情况。

考虑 3 3 3 最先出栈,那么 44 还没有入栈,栈中有 1 , 2 , 3 1,2,3 1,2,3 那么出栈顺序有 3214 , 3241 , 3421 3214,3241,3421 3214,3241,3421 三种情况。

考虑 2 2 2 最先出栈,那么有 2134 , 2143 , 2314 , 2341 , 2431 2134,2143,2314,2341,2431 2134,2143,2314,2341,2431 五种情况。

考虑 1 1 1 最先出栈,那么有 1234 , 1243 , 1324 , 1342 , 1432 1234,1243,1324,1342,1432 1234,1243,1324,1342,1432 五种情况。

总共有 1 + 3 + 5 + 5 = 14 1+3+5+5=14 1+3+5+5=14 种情况。

公式一——直接计算

对于n个元素,一共有
1 n + 1 C 2 n n \frac1{n+1}C_{2n}^n n+11C2nn
种出栈顺序,这就是卡特兰数

公式二——递推

f ( n ) f(n) f(n)表示对于 n n n个元素一共有 f ( n ) f(n) f(n)种出栈序列情况
初始化 f [ 0 ] = f [ 1 ] = 1 f[0]=f[1]=1 f[0]=f[1]=1
f ( n ) = ∑ i = 1 n f ( i − 1 ) f ( n − i ) f\left(n\right)=\sum_{i=1}^nf\left(i-1\right)f\left(n-i\right) f(n)=i=1nf(i1)f(ni)

本质上可以理解成一共有两种操作,权值为0

  1. 权值加1
  2. 权值减1
    一共进行 2 n 2n 2n次操作,操作过程中权值不小于0,并且操作结束后结果为0

例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这道题的思路就是把每一个五元的人看作+1入栈,十元的人看作-1出栈,一共n个元素
按照卡特兰数直接求解即可

#include <bits/stdc++.h>
using namespace std;
long long ans=1,n;
int main() {
    cin >> n;
    for(long long i=n+1;i<=2*n;i++){
        ans*=i;
    }
    for(long long i=1;i<=n;i++){
        ans/=i;
    }
    cout<<ans/(n+1);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读