//2014年8月24日10:09:19
//2014年8月24日10:23:27
//公式,迭代,效率不高
//f(n) = 2f(n-1)+2f(1)f(n-2)+2f(2)f(n-3)+...+2f((n-1)/2-1)f((n-1)/2+1)+f((n-1)/2)f((n-1)/2) n为奇数
//f(n) = 2f(n-1)+2f(1)f(n-2)+2f(2)f(n-3)+...+2f(n/2)f(n/2) n为偶数
#include <iostream>
using namespace std;
class Solution {
public:
int numTrees(int n) {
if(n==1 || n==2){
return n;
}
if(n == 0){
return 1;
}
int result = 0;
if(n%2 == 1){
result += numTrees((n-1)/2)*numTrees((n-1)/2);
for(int i=(n-1)/2+1 ; i<=n-2 ; i++){
result += 2*numTrees(i)*numTrees(n-1-i);
}
result += 2*numTrees(n-1);
}
else{
for(int i=n/2 ; i<=n-2 ; i++){
result += 2*numTrees(i)*numTrees(n-1-i);
}
result += 2*numTrees(n-1);
}
return result;
}
};
int main()
{
Solution A;
cout << A.numTrees(3) << endl;
return 0;
}