洛谷 P1044 栈
题目:
- 有图,转链接
题解:
- 这是一道卡特兰数
- 具体推导过程:
- 设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;
}