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项

posted @ 2020-09-03 10:44  yys_c  阅读(130)  评论(0编辑  收藏  举报