자연수 1부터 N까지의 노드를 사용하여 만들 수 있는 서로 다른 이진 탐색 트리(BST) 의 개수를 구하는 문제이다.
dp[n]을 노드 n개로 만들 수 있는 BST의 개수라고 하자.
루트를 1부터 n까지 하나씩 선택해보면,
그러므로 점화식은 다음과 같다:
dp[n] = sum(dp[i - 1] * dp[n - i]) for i in 1..n
dp[0] = 1: 빈 트리도 하나의 경우로 간주dp[1] = 1: 하나의 노드로 만들 수 있는 트리는 하나public class UniqueBST {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int nodes = 2; nodes <= n; nodes++) {
for (int root = 1; root <= nodes; root++) {
int left = root - 1;
int right = nodes - root;
dp[nodes] += dp[left] * dp[right];
}
}
return dp[n];
}
}
dp[n]은 "n개의 노드로 만들 수 있는 BST 구조의 개수" 를 의미한다.