卡特蘭數的計算 - 代碼實現


卡特蘭數的介紹見: 卡特蘭數及其應用 

 

各公式求解算法

 公式1和公式2可以使用循環遞推來求,公式3和公式4,可以先寫一個函數求出組合數C(n,m),再用組合數進行計算。
 可以使用以下遞推式來求組合數C(n,m),C(n,m)可以用二維數組C[n][m]表示,通過以下公式,可以遞推得出每一項的C[i][j]的值。
組合數的計算見: 組合數大小的求法
注意:如果這個數太大,那么題目可能會要求取模,此時使用第4個公式更好。因為加減運算對取模結果沒有影響。
 

代碼實現

/* 公式1 */
#define MAXN 20
int h[MAXN];
int n;
int main()
{
    scanf("%d", &n);
    h[0] = 1;
    h[1] = 1;
    for(int i = 2; i <= n; ++i) 
    {
        for(int j = 0; j <= i-1; ++j)
        {
            h[i] += h[j] * h[i-1-j];
        }
    }
    
    printf("%d ", h[n]);
    
    return 0;
}


/* 公式2 */
#define MAXN 20
int h[MAXN];
int n;
int main()
{
    scanf("%d", &n);
    h[0] = 1;
    h[1] = 1;
    for(int i = 2; i <= n; ++i) 
    {
        h[i] = h[i-1] * (4*i-2) / (i+1);  
    }
    
    printf("%d ", h[n]);
    
    return 0;
}


/* 公式3 */
#define MAXN 20
int C[MAXN][MAXN];
int n;
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= 2*n; ++i) 
    {
        C[i][0] = C[i][i] = 1;
        for(int j = 1; j < i; ++j)
        {
            C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
    
    printf("%d ", C[2*n][n]/(n+1));
    
    return 0;
}


/* 公式4 */
#define MAXN 20
int C[MAXN][MAXN];
int n;
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= 2*n; ++i) 
    {
        C[i][0] = C[i][i] = 1;
        for(int j = 1; j < i; ++j)
        {
            C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
    
    printf("%d ", C[2*n][n] - C[2*n][n+1]);
    
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM