(有一个长度为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项