**输入:**n = 3
输出: 5
dpi 表示由 i个节点组成且节点值从 1 到 i 互不相同的 二叉搜索树 的种数。二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。
dp0=1
dp1=1
n=3一共的种数:头1 + 头2 + 头3
头1 = 左子树0节点 * 右子树2节点,因为2和3比1大,只能在右子树,下面同理。
头2 = 左子树1节点 * 右子树1节点
头3 = 左子树2节点 * 右子树0节点
所以dp3 = dp0 * dp2 + dp1 * dp1 + dp2 * dp0
所以递推公式 :dpi 表示由 i个节点组成且节点值从 1 到 i 互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数
所以dpi += dpj-1 * dpi-j
cpp
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1;
// dp[1] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
};