아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

트리 가짓수 세기

시간 제한2초메모리 제한256 MB

요약
삽입 순서를 자유롭게 정할 때 키 1부터 N까지로 만들 수 있는 높이 K 이하 이진 탐색 트리의 개수를 10^9+7로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 트리, 조합론, 재귀
정답자
아직 제출이 없습니다

문제

이진 검색 트리(BST, Binary Search Tree)는 모든 노드가 최대 22개의 자식 노드를 가지는 트리이다. 어떤 노드에 쓰여 있는 수가 XX라면, 그 노드의 왼쪽 서브트리에는 XX보다 작은 수만, 오른쪽 서브트리에는 XX보다 큰 수만 저장되어 있어야 한다.

다음은 BST에 수를 삽입하는 함수를 수도 코드로 작성한 것이다.

insert(number X, node N)
    if X가 노드 N에 있는 수보다 작다면
        if N의 왼쪽 자식이 없다면
            X를 포함하는 새 노드를 만든 뒤, N의 왼쪽 자식으로 만든다
        else
            insert(X, N의 왼쪽 자식)
    else (X가 노드 N에 있는 수보다 크다면)
        if N의 오른쪽 자식이 없다면
            X를 포함하는 새 노드를 만든 뒤, N의 오른쪽 자식으로 만든다
        else
            insert(X, N의 오른쪽 자식)

첫 번째로 삽입하는 수를 루트로 놓고, 그 뒤에 삽입하는 모든 수 X에 대해 insert(X, root)를 호출한다.

트리의 높이는 루트 노드에서 리프 노드까지의 경로 중 가장 긴 경로 위에 있는 노드의 개수이다. 리프 노드는 자식 노드가 없는 노드를 뜻한다.

11부터 NN까지의 수를 BST에 삽입하려고 한다. 삽입 순서를 자유롭게 정할 수 있을 때, 높이가 KK 이하인 BST의 가짓수를 구해보자. BST의 루트 노드는 높이가 1이라고 가정한다.

22 11 33 순으로 넣었을 때 만들어지는 BST와 22 33 11 순으로 넣었을 때 만들어지는 BST는 같은 경우이고, 33 22 11 44와 22 11 33 44 순으로 넣었을 때 만들어지는 BST는 서로 다른 경우이다.

구하려는 경우의 수는 매우 커질 수 있으므로 답을 109+710^9+7로 나눈 나머지를 출력한다.

입력

첫 번째 줄에 두 정수 NN, KK가 공백으로 구분되어 주어진다. (1≤N≤3500, 1≤K≤121 \leq N \leq 3500,\, 1 \leq K \leq 12)

출력

만들어지는 BST의 경우의 수를 109+710^9+7로 나눈 나머지를 출력한다.

예제3

  1. 예제 1

    입력
    1 1
    
    예상 출력
    1
    
  2. 예제 2

    입력
    4 2
    
    예상 출력
    0
    
  3. 예제 3

    입력
    5 3
    
    예상 출력
    6