My code:
#include <cstdio>
#include <iostream>
using namespace std;
long long C[40][40];
int main()
{
C[0][1] = 1; // 递推边界
// 杨辉三角
for (int i = 1; i <= 40; ++i)
for (int j = 1; j <= i; ++j)
C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
// 卡特兰数通项公式
int n;
scanf("%d", &n);
printf("%d\n", C[2 * n + 1][n + 1] / (n + 1));
return 0;
}
题解的代码(bushi抄题解)(
#include<cstdio>
using namespace std;
const int siz = 20;
int n, c[siz*2][siz];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= 2 * n; ++i)
c[i][1] = c[i][i] = 1;
for (int i = 3; i <= 2 * n; i++)
for (int j = 2; j < i; j++)
c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
printf("%d", c[2 * n][n] - c[2 * n][n - 1]);
return 0;
}