class Solution:
def numTrees(self, n: int) -> int:
#dp[n]即n个节点可构成多少个二叉搜索树
#动态转移dp[n] = (1)dp[0]*dp[n-1] + (2)dp[1]*dp[n-2] + ...(n)dp[n-1]*dp[0]
dp = [1]*(n+1)
for i in range(1,n+1):
cur = 0
for j in range(0,i):
cur += dp[j]*dp[i-j-1]
dp[i] = cur
return dp[n]