题目
算法
(组合计数,卡特兰数) O ( n 2 ) O(n^2) O(n2)
首先任何一种合法的入栈、出栈操作序列都可以得到一个不同的1~n的排列,因此可以得到的排列总数等于合法入栈、出栈操作序列的个数。
该问题等价于求第 N N N项 C a t a l a n Catalan Catalan数。
时间复杂度
在本题中我们使用公式 C n m = C n − 1 m + C n − 1 m − 1 C_n^m=C_{n-1}^m+C_{n−1}^{m−1} Cnm=Cn−1m+Cn−1m−1 来计算卡特兰数。时间复杂度是 O ( n 2 ) O(n^2) O(n2)。
C++代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 40;
typedef long long LL;
int n;
LL c[N][N];
int main(){
cin >> n;
for(int i = 0; i <= n * 2; i++)
for(int j = 0; j <= i; j++)
if(!j) c[i][j] = 1;
else c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
cout << c[n * 2][n] / (n + 1) << endl;
return 0;
}