만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

분산 괄호

시간 제한1초메모리 제한1024 MB

요약
길이가 n이고 깊이가 정확히 k인 분산 괄호 수열의 개수를 10^9+9로 나눈 나머지로 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 문자열, 조합론
정답자
아직 제출이 없습니다

문제

산술식의 계산 순서는 보통 괄호를 어떻게 배치했는지로 정해진다. 예를 들어 (3⋅(2+1))⋅(4−5)(3 \cdot (2+1)) \cdot (4-5)가 있다. 식에서 괄호를 제외한 모든 원소를 지우면 남은 기호들이 괄호 수열 (())()(())()를 이룬다. 문자 0을 추가해도 수열이 깨지지 않는다고 가정한다. 이런 수열을 분산 괄호 수열이라고 부른다. 다음과 같이 정의할 수도 있다.

  • 빈 문자열은 분산 괄호 수열이다.
  • SS와 TT가 분산 괄호 수열이면 0S0S, S0S0, (S)(S), STST도 분산 괄호 수열이다.

분산 괄호 수열의 깊이는 접두사에서 여는 괄호 수와 닫는 괄호 수의 차이의 최댓값이다. SS의 접두사는 SS의 끝에서 문자를 지워서 얻은 문자열이다. 예를 들어 ABCABABCAB의 접두사는 빈 문자열, AA, ABAB, ABCABC, ABCAABCA, ABCABABCAB이다. (0)(0())0(0)(0())0의 깊이는 2이다. 접두사 (0)(0((0)(0(에는 여는 괄호가 3개, 닫는 괄호가 1개 있기 때문이다.

길이가 nn이고 깊이가 kk인 분산 괄호 수열의 개수를 구하시오.

입력

한 줄에 공백으로 구분된 정수 nn과 kk가 주어진다 (1≤n≤3001 \le n \le 300, 0≤k≤n0 \le k \le n).

출력

길이가 nn이고 깊이가 kk인 분산 괄호 수열의 개수를 109+910^9+9로 나눈 나머지를 출력한다.

예제3

  1. 예제 1

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

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

    입력
    3 2
    
    예상 출력
    0