卡特兰数

对于组合数学问题,优先考虑能否通过 dp 预处理其值,不要推组合数公式,比如卡特兰数,公式为:Ca(n)=C(2n,n)/(n+1)Ca(n) = C(2n, n) / (n + 1)

但可以通过 dp 非常简单地处理:

vector<Z> f(m + 1);
f[0] = 1;
for (int i = 1; i <= m; i++) {
// 长度为 i 的括号序列,多出 j 个左括号的方案数
vector<Z> nf(m + 1);
for (int j = 0; j <= m; j++) {
if (j) {
nf[j] += f[j - 1];
}
if (j + 1 <= m) {
nf[j] += f[j + 1];
}
}
swap(f, nf);
}