diff --git a/dynamic_programming/README.md b/dynamic_programming/README.md
index dd27748..8b59456 100644
--- a/dynamic_programming/README.md
+++ b/dynamic_programming/README.md
@@ -154,6 +154,47 @@ def climb_stairs_memoization(n: int) -> int:
+* another good examples is calculating all possible subnodes in a tree:
+
+
+
+```python
+class Node:
+ def __init__(self, val=0, left=None, right=None):
+ self.val = val
+ self.left = left
+ self.right = right
+
+
+def all_possible_bst(start, end, memo):
+
+ result = []
+ if start > end:
+ return result
+
+ if (start, end) in memo:
+ return memo[(start, end)]
+
+ for i in range(start, end + 1):
+ left = all_possible_bst(start, i - 1, memo)
+ right = all_possible_bst(i + 1, end, memo)
+
+ for l in left:
+ for r in right:
+ result.append(Node(i, l, r))
+
+ memo[(start, end)] = result
+ return result
+
+
+def generate_trees(n):
+
+ memo = {}
+ return all_possible_bst(1, n, memo)
+```
+
+
+
----
### time complexity
@@ -208,3 +249,5 @@ def backtrack(candidate):
remove(next_candidate)
````
+
+