Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFSDFS
- Sieve_of_Eratosthenes
- POJ
- mathematics
- graph
- Euler circuit
- Algospot
- Dag
- disjoint-set
- BOJ
- GCD
- CS Academy
- 백준
- Cycle detecting
- Euler path
- DynamicProgramming
- Shortest path
- scc
- Greedy
- backtracking
- hashing
- graph modeling
- dynamic programming
- implementation
- bitmask
- flows
- BST
- Segment Tree
- Eulerian path
- Eulerian circuit
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 17428 K번째 괄호 문자열 본문
* BOJ 17428 K번째 괄호 문자열
[분류 : 다이나믹 프로그래밍]
[풀이]
올바른 괄호 문자열이 몇 개 있을 수 있는지 생각해보자. 당연히 이 문제를 풀어본 사람은 카탈란 수를 떠올릴 수 있을거고, 아니더라도 아래 점화식을 떠올릴 수 있다.
하지만 이런 방식은 사전순에 대한 처리를 할 수 없어진다.
보다 간단하게 생각해보자. 현재 위치에서 어떤 괄호를 쓸 것인지를 생각해보자. 단 지금까지 구성해온 문자열에서 모두 쓸 수 있는 것은 아니다. '('과 ')' 수가 똑같을뿐만 아니라 왼쪽에서 오른쪽으로 순회할 때 ')' 수가 '(' 수보다 많지 않도록 구성해야 한다.
따라서 정의해야 하는 함수는 현재 위치 p에서 '('가 ')'보다 r만큼 많을 때 나올 수 있는 올바른 괄호 문자열의 수를 반환하도록 한다. 또 '('을 사용했을 때의 수와 ')'을 사용했을 때의 수를 분리하여 언제 K번째가 나올 수 있는지 추적할 수 있도록 dp를 구성해주면됩니다.
rec(p, r) = 현재 위치 p에서 '('가 ')'보다 r만큼 많을 때 나올 수 있는 올바른 괄호 문자열의 수
'Solved problems' 카테고리의 다른 글
BOJ 12861 죄수에게 주는 뇌물 (0) | 2020.06.08 |
---|---|
BOJ 1023 괄호 문자열 (1) | 2020.06.04 |
BOJ 3001 이상한 문제 (0) | 2020.06.03 |
BOJ 16876 재미있는 숫자 게임 (0) | 2020.05.28 |
BOJ 2543 초고속철도 (0) | 2020.05.28 |
Comments