class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
if n==0:
return 0
cache={}
return self._gen(cache, 1, n)
def _gen(self, cache, start, end):
if start>end:
return 1
if (start,end) in cache:
return cache[start,end]
ret=0
for i in xrange(start, end+1):
leftNodes=self._gen(cache, start, i-1)
cache[(start, i-1)] = leftNodes
rightNodes=self._gen(cache, i+1, end)
cache[(i+1, end)] = rightNodes
ret+=leftNodes*rightNodes
cache[(start, end)] = ret
return ret