解题思路:
有个习惯就是先写出前几个答案,找找规律,
n=1 ans=1
n=2 ans=2
n=3 ans=5
n=4 ans=14
n=5 ans=42
可以看到这是一个卡特兰数,它的递推公式为:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
例如:
h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
所以我们定义一个数组dp,dp[n]表示的是n的情况的总数,所以写两个for循环即可
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<i;j++){
dp[i]+=dp[j]*dp[i-j-1];
}
}
return dp[n];
}
};