//卡特兰数递归实现:超时
/*#include <iostream>
using namespace std;
int catalan(int n){
if (n == 1) return 1;
if (n == 2) return 1;
int res = 0;
for (int i = 1; i <= n - 1;i++){
res += catalan(i)*catalan(n - i);
}
return res;
}
int main(){
int n;
while (cin >> n){
cout << catalan(n-1) << endl;
}
return 0;
}*/
//卡特兰数非递归实现
#include <iostream>
using namespace std;
int arr[22];
int catalanNumber(int n){
int arr[22];
arr[1]=1;
for(int i=2;i<n+1;i++){
arr[i]=0;
for(int j=1;j<i;j++)
arr[i]+=arr[j]*arr[i-j];
}
return arr[n];
}
int main(){
int n;
while (cin >> n){
cout << catalanNumber(n-1) << endl;
}
return 0;
}
本文探讨了卡特兰数的两种实现方法,包括一种容易导致超时的递归实现,以及一种更高效的非递归实现。非递归实现通过动态规划的方式,利用数组存储中间结果,避免了重复计算,显著提高了算法效率。
2962

被折叠的 条评论
为什么被折叠?



