心路历程:
这道题说实话有点不好想,很难第一时间想到是DP问题,与其说这是一个动态规划,其实更像是一个找规律的问题。
假设当前有n个结点,那么以第i个结点(按大小顺序)为根节点,其左子树有i-1个结点,右子树有n-i个结点,那么其实这种情况下就有dp(i-1)*dp(n-i)种情况,然后再去遍历这个i即可。
解法:递推式DP
python
class Solution:
def numTrees(self, n: int) -> int:
# 想不到这是一个动态规划题
res = [0] * (n+1)
res[0] = 1
res[1] = 1
for i in range(2, n + 1):
for j in range(i):
res[i] += res[j] * res[i-j-1] # 以j为根节点,共i-1个结点,j的左子树有j个,右侧有i-1-j个
return res[n]