class Solution {
public:int numTrees(int n) {vector<int> dp(n+1);dp[0] = 1;dp[1] = 1;for(int i = 2;i <= n;i++){for(int j = 1;j <= i;j++) // 当根节点为j时{dp[i] += dp[j-1] * dp[i-j];}}return dp[n];}
};
/* dp[i] = i个不同的数组成的二叉搜索数的个数假设 i = 5当根节点等于 1 时 ,其余数字都比1大,只能在右边 dp[i] += dp[4]当根节点等于 2 时,左边有一个1比2小,右边有三个比2大的数字 dp[i] += dp[1] * dp[3]当根节点等于 3 时,左边有两个数比3小,右边有两个数比3大的数字 dp[i] += dp[2] * dp[2]...直到根节点等于5,左边有4个数字比5小,只能放在5的左边,dp[i] += dp[4]
*/