2 solutions

  • 6
    @ 2025-3-16 19:49:40

    前言

    其实卡特兰数跟很多东西都有联系(计算几何、递推等),且本题解较长,请耐心看完哦!题解求赞qwq

    解题思路

    1.暴力

    看到题可以发现,本题可以模拟 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。

    然后就 TLE 了(PS:我没有试过,但用正解算了 n=20n = 20,然后肯定 TLE 的)

    2.卡特兰数(Catalan)

    现在讲讲正解。

    注:定义 CnC_n 为第 nn 个卡特兰数。

    其中,C0=C1=1C_0 = C_1 = 1

    先放一些卡特兰数:

    11251442132429143048621,1,2,5,14,42,132,429,1430,4862

    很显然,这是从 C0C_0C9C_9

    请注意,本题解的卡特兰数讲解是简单的版本,并且卡特兰数有很多种公式。

    推导卡特兰数可用二叉树,我们想想:

    • 个节点可以建几个不同的二叉树?
    • 11 个(空二叉树也是树)

    • 个节点可以建几个不同的二叉树?
    • 11 个(可以自己画图,这里就不放图了)

    • 个节点可以建几个不同的二叉树?
    • 22 个(可以自己画图,这里就不放图了)

    • 个节点可以建几个不同的二叉树?
    • 55 个(可以自己画图,这里就不放图了)

    • 个节点可以建几个不同的二叉树?
    • 1414 个(可以自己画图,这里就不放图了)

    • 个节点可以建几个不同的二叉树?
    • 4242 个(可以自己画图,这里就不放图了)

    可以发现,这里的的数就是卡特兰数!

    然后我们充分发挥人类智慧!!!

    可以得到:

    C2=1×63=1×2=2C_2 = 1 \times \frac{6}{3} = 1 \times 2 = 2

    $C_3 = 2 \times \frac{10}{4} = 2 \times \frac{5}{2} = 5$,

    C4=5×145=14C_4 = 5 \times \frac{14}{5} = 14

    就发现了真理:Cn=Cn1×4n2n+1C_n = C_{n-1} \times \frac{4n-2}{n+1}

    然后你就 AC 了!

    解题代码

    #include <bits/stdc++.h>
    using namespace std;
    
    long long n, a[20] = {1, 1, 2, 5};
    
    int main()
    {
    	cin >> n;
    	for (long long i = 4; i <= n; i++) a[i] = a[i - 1] * (4 * i - 2) / (i + 1);
    	cout << a[n] << endl;
    	return 0;
     }
    

    总结

    这题其实有很多思路:

    • 搜索;(不建议的,但也不是不可以)
    • 分治,递推;(强推!!!)
    • 打表。
    • @ 2025-3-16 20:18:18

      也可使用递归记忆化

      公式: \sum

  • 1
    @ 2025-3-18 13:42:03

    根据f(n1)  4n  2n + 1=f(n)f(n-1) ~*~ \frac{4n~-~2}{n~+~1} = f(n)写出的AC呆🐎:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 20;
    
    int n, a[N];
    
    int main()
    {
    	cin >> n;
    	a[0] = a[1] = 1;
    	for (int i = 1; i <= n; i++)
    	{
    		a[i] = a[i - 1] * (((4 * i) - 2) / (double)(i + 1));
    	}
    	cout << a[n];
    	
    	return 0;
    }
    

    带计算过程版:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 20;
    
    int n, a[N];
    
    int main()
    {
    	cin >> n;
    	a[0] = a[1] = 1;
    	for (int i = 1; i <= n; i++)
    	{
    		a[i] = (double)a[i - 1] * (double)((double)((4 * i) - 2) / (double)(i + 1));
    		printf("\na[i - 1] * (((4 * i) - 2) / (i + 1))\n= %d * ((%d) - 2) / %d)\n= %d * (%d)\n= %d\n", a[i - 1], 4 * i, i + 1, a[i - 1], ((4 * i) - 2) / (i + 1), a[i - 1] * (((4 * i) - 2) / (i + 1)));
    	}
    	cout << a[n];
    	
    	return 0;
    }
    
    • @ 2025-3-18 18:52:49

      茶叶递推式过程

      /*
      https://www.luogu.com.cn/article/vj5wm9da
      1递归-》递推
      2组合数学-卡特兰数-组合数
      3数据量小打表即可,大的时候注意逆元(费马小定理、欧拉定理)、卢卡斯定理、分解质因数https://blog.csdn.net/liuzibujian/article/details/81346595
      1 1
      2 2
      3 5
      4 14
      5 42
      6 132
      7 429
      8 1430
      9 4862
      10 16796
      11 58786
      12 208012
      13 742900
      14 2674440
      15 9694845
      16 35357670
      17 129644790
      18 477638700
      */
      #include<iostream>
      #define ull unsigned long long
      using namespace std;
      const int maxn=1E3+10;
      ull n,ans,f[maxn],r[maxn][maxn];//recursion
      int main(){
      	cin>>n;
      	/*//法1:递推r[i][j]指i个元素入栈,j元素出栈
      	for(int i=0;i<=n;i++){
      		r[i][0]=1;//只进不出只有一种情况
      	}
      	for(int i=1;i<=n;i++){
      		int j=1;
      		for(;j<i;j++){//出栈元素个数必然j<=i入栈元素个数
      			r[i][j]=r[i][j-1]+r[i-1][j];
      		}
      		r[i][j]=r[i][j-1];//i==j
      		// cout<<i<<" "<<r[i][i]<<endl;
      	}
      	cout<<r[n][n];
      	*/
      
      	/*//法2:分治递推,最容易推导的卡特兰数递推式
      	f[0]=f[1]=1;
      	for(int k=2;k<=n;k++){
      		for(int i=0;i<k;i++){
      			f[k]+=f[i]*f[k-1-i];
      		}
      		// cout<<k<<" "<<f[k]<<endl;
      	}
      	cout<<f[n];
      	*/
      
      	//法2:分治递推,花式处理Cn 2n/n+1等递推式推h[n]=(4n-2)/(n+1)*h[n]
      	f[1]=1;
      	for(int i=2;i<=n;i++){
      		f[i]=f[i-1]*(4*i-2)/(i+1);   
      	}
      	cout<<f[n];
      	return 0;
      }
      
  • 1

Information

ID
1156
Time
1000ms
Memory
125MiB
Difficulty
8
Tags
# Submissions
69
Accepted
13
Uploaded By