卡特兰数
对于组合数学问题,优先考虑能否通过 dp 预处理其值,不要推组合数公式,比如卡特兰数,公式为:
但可以通过 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);}