题目连接
首先是二叉搜索树的定义,对于每个顶点,他的左子树小于顶点,右子树大于等于顶点

首先按照递归的思想
从1开始划分那么左子树为空,右子树为2,3,又可以从2,3划分,那么一共可以组成2个,从2开始那么能组成1个,从3开始能组成2个,所以一共是5个
那么按照动态规划的思想
从底下向上划分,分别从1到2,1,3,1,4分别算出子序列能组成的个数,因为左边和右边不同组成结构要求笛卡尔积,则有 dp[i]+=dp[j-1]*dp[i-j];
public int numTrees(int n) {
int[] dp=new int[101010];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}