- 有图,转链接
- 这是一道卡特兰数
- 具体推导过程:
- 设dp[i]为有i个数时的方案数。设x为最后出栈的一个元素,则已经出栈的元素中比x大的元素个数为n-x个,比x小的元素个数为x-1个。那么每部分的方案数分别为dp[n - x]、dp[x - 1]。因为它们两部分互相影响,是一个乘法原理。那么当i=n时,dp[n] = ?因为x可以在1到n中取值,所以总的方案数dp[n] = dp[0] * dp[n - 1] + dp[1] * dp[n - 2] + ... + dp[n - 1] * dp[0]
#include <iostream> #include <cstdio> using namespace std; int n; int f[20]; int main() { cin >> n; f[0] = f[1] = 1; for(int i = 2; i <= n; i++) for(int j = 0; j < i; j++) f[i] += f[j] * f[i - j - 1]; cout << f[n]; return 0; }