문제 링크
요약
- 점화식 찾는 문제
최종
결과
dp[i]에 대한 점화식은 다음과 같다.- Root 의 왼쪽에만 달려있는 경우: 이때는
dp[i - 1]이다. - Root 의 오른쪽에만 달려있는 경우: 마찬가지로
dp[i - 1]이다. - Root 의 양쪽에 모두 달려있는 경우:
- 왼쪽의 node 수가
l개라고 하고, 오른쪽의 node 수가r개라고 하자. - 그럼
1 <= l,r <= i - 1이고,l + r == i - 1이 될것이다. - 총 경우의 수는 위를 만족하는
l와r에 대해dp[l] * dp[r]이다.
- 왼쪽의 node 수가
- Root 의 왼쪽에만 달려있는 경우: 이때는
- 코드는:
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] += dp[i - 1] * 2;
for (int l = 1; l <= i - 2; l++) {
dp[i] += dp[l] * dp[i - l - 1];
}
}
return dp[n];
}
};