Catalan数

(有一个长度为2n的01序列,其中1,0各n个,要求对于任意的整数k∈[1,2n],数列的前k个数中,\ 1的个数不少于0的个数, 求对于任意一个n满足条件的串的个数。)
dp方法:
(f(i, j))表示存在i个0和j个1时满足条件的所有串的集合,存储数量属性

(1. i = 0: f(i, j) = 0\ 2. j = 0: f(i, j) = 1\ 3. i < j: f(i, j) = 0\ 4. i = j: f(i, j) = f(i, j - 1)\ 5. i > j: f(i, j) = f(i - 1, j) + f(i, j - 1)\ )

#include<iostream>
using namespace std;

const int N = 1010;
int f[N][N];
int n;

int main(){
    cin >> n;
    
    for(int i = 0; i <= n; i ++) f[0][i] = 1;
    for(int i = 1; i <= n; i ++)
        for(int j = i; j <= n; j ++){
            f[i][j] = f[i - 1][j];
            if(j > i) f[i][j] = f[i - 1][j] + f[i][j - 1];
        }
        
    cout << f[n][n];
}

代码等价变换:

#include<iostream>
using namespace std;

const int N = 1010;
int f[N];
int n;

int main(){
    cin >> n;
    
    for(int i = 0; i <= n; i ++) f[i] = 1;
    for(int i = 1; i <= n; i ++)
        for(int j = i + 1; j <= n; j ++)
            f[j] += f[j - 1];
        
    cout << f[n];
}

f[0n]正好是卡特兰数的0n项

原文地址:https://www.cnblogs.com/tomori/p/13606309.html