动规核心 状态转移方程/递推公式 i用来遍历从1到n,枚举所有以j为头结点个数的情况, 此时头结点j的左边有j-1个结点,右边有i-j个结点,以j为头结点有dp[j-1]* dp[i-j]个不同的二叉搜索树 对所有j<=n dp[i]+=dp[j-1]*dp[i-j]
class Solution {
public:
int numTrees(int n) {
// std::vector<int> dp(n+1)所有元素将被默认初始化为0
// 等价std::vector<int> dp(n+1,0);
std::vector<int> dp(n+1);
dp[0]=1;
for (int i=1;i<n+1;i++)
for (int j=1;j<=i;j++)
//初始化时要全0因为在原dp[i]基础上+=
dp[i]+=dp[j-1]*dp[i-j];
return dp[n];
}
};