def num_trees(n):
dp = [<NUM_LIT:0>] * (n+<NUM_LIT:1>)<EOL>dp[<NUM_LIT:0>] = <NUM_LIT:1><EOL>dp[<NUM_LIT:1>] = <NUM_LIT:1><EOL>for i in range(<NUM_LIT:2>, n+<NUM_LIT:1>):<EOL><INDENT>for j in range(i+<NUM_LIT:1>):<EOL><INDENT>dp[i] += dp[i-j] * dp[j-<NUM_LIT:1>]<EOL><DEDENT><DEDENT>return dp[-<NUM_LIT:1>]<EOL>
:type n: int
:rtype: int