很容易想到迭代的方法去做。我自己感觉这个迭代有一点点dc的意思在里面。
int numTrees(int n) {
if(n<=1)
return 1;
int res=0;
for(int i=0;i<n;++i){
res+=numTrees(i)*numTrees(n-1-i);
}
return res;
}
果不其然超时了。所以自底向上DP来解决这个问题。如果直接生搬硬套,用上一种方法自顶向下DP做的话会写的有点麻烦。
int numTrees(int n) {
vector<int> memo(n+1,0);
memo[0]=1;
memo[1]=1;
for(int i=2;i<=n;++i){
for(int j=0;j<i;++j){
memo[i]+=memo[j]*memo[i-j-1];
}
}
return memo[n];
}