정수 n이 있다고 가정하면 1에서 n까지의 값을 저장하는 구조적으로 고유한 모든 이진 검색 트리를 계산해야 합니다. 따라서 입력이 3이면 출력은 트리와 같이 5가 됩니다. -
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- n + 1 크기의 배열 하나 만들기
- dp[0] :=1
- i:=1 ~ n
- j의 경우 :=0 ~ i – 1
- dp[i] :=dp[i] + (dp[i – 1 – j] * dp[j])
- j의 경우 :=0 ~ i – 1
- 반환 dp[n]
예(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: int numTrees(int n) { vector <int> dp(n+1); dp[0] = 1; for(int i =1;i<=n;i++){ for(int j = 0;j<i;j++){ //cout << j << " " << i-1-j << " " << j << endl; dp[i] += (dp[i-1-j] * dp[j]); } } return dp[n]; } }; main(){ Solution ob; cout << ob.numTrees(4); }
입력
4
출력
14