# 96-Unique Binary Search Trees
###### tags: `Medium`
* Question:
https://leetcode.com/problems/unique-binary-search-trees/
* Key:
1. Dynamic programming
2. how to use two for-loops to get sum of 2 elements in an array.
* Hint:
1. G(N) : Number of unique BST formed using 1 to N
2. 第n個的數目為前面n-1種的兩兩排列組合G(N) = G(0) * G(N) + G(1) * G(N-1) + G(2) * G(N-2) .... + G(N) * G(0)
3. Can use **dynamic programing** to build up upper solution using lower solution as
4. G(N) will need the solutions of G(2), G(3), G(4) .... G(N-1)
```cpp=
class Solution {
public:
int numTrees(int n) {
// track solutions for each number of nodes
vector<int> dp(n+1,0);
// empty node has 1 tree with no root
dp[0] = 1;
// 1 node has 1 tree with one root
dp[1] = 1;
// calculate solution for i=2 to n where total node is 2 to n
for(int i=2;i<=n;i++)
{
// for ith iteration problem has i nodes
// from 1 to ith node each node can be a root
// each root has possible trees with G(leftSubtree) * G(RightSubtree)
// Adding up the solutions for 1 to i gives G(i)
for(int j=1;j<=i;j++)
{
dp[i] += dp[j-1] * dp[i-j];
}
}
// return number of unique BST trees with n nodes 1 to N
return dp[n];
}
};
```