想法:
n个结点组成的树的种类,可以理解成为 1-n每个结点当作根节点然后分别的种类的总和
每一为j开头的结点,可以理解成其左子树为j-1个结点,右子树为i-j个结点,其可能性为左边的可能组合*右边树的可能组合
动态规划五部曲1 dp数组含义
有几个结点时,有多少种不同的组合 所求的即为dp[n]
dp[0]=1;
可求得 dp[1]=dp[0]*d[0]=1;
dp[2]=dp[0]*dp[1]+dp[1]*dp[0];=2;
抽象出来可以得 dp[n]=dp[0]*dp[n-1] +++++++++dp[n-1]*dp[0];
class Solution {
public:
int numTrees(int n) {
vector<int>dp(n+1);
dp[0]=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];
}
};