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
- Euler path
- Euler circuit
- DynamicProgramming
- Eulerian circuit
- BST
- dynamic programming
- graph
- graph modeling
- Segment Tree
- Cycle detecting
- bitmask
- GCD
- Shortest path
- POJ
- mathematics
- Eulerian path
- Greedy
- BFSDFS
- Sieve_of_Eratosthenes
- scc
- Algospot
- hashing
- flows
- 백준
- CS Academy
- BOJ
- implementation
- disjoint-set
- backtracking
- Dag
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 1410 패턴의 개수 본문
* BOJ 1410 패턴의 개수
[분류 : 다이나믹 프로그래밍, 비트셋]
1. [같은 길이의 패턴] 길이가 다른 패턴은 절대 같은 단어를 포함할 수 없다. 같은 길이끼리만 모아서 생각해보자.
2. [비트 셋] 집합의 크기가 아무리 커봐야 15이므로 비트 셋을 쓰기에 충분히 작다. 또 2^15의 배열의 크기로도 충분히 작음을 알 수 있다.
3. [다이나믹 구성] 1.에 있는 조건을 가져와서 같은 길이를 가지는 패턴들만 생각해보자.
dp[p][s]=p위치에 있는 문자를 결정해야하고, 현재 겹치는 패턴의 집합이 s일 때, 일치하는 패턴의 수가 정확히 K인 경우의 수
p이전에 선택한 문자들이 모두 일치하는, 또는 문자 ?로 대체할 수 있었던 패턴들이 s 비트 셋에 담겨있다. 현 위치 p에서 문자 a-z를 선택하며 p위치에 선택한 문자와 적합하지 않은 패턴들은 모두 비트 셋에서 제거한다. 그 이후 같은 방식으로 부분 문제를 풀어나가면 된다.
(참고) 비트 셋에서 1로 설정된 값(여기서는 적합한 패턴의 인덱스)의 개수를 빌트인 함수 __builtin_popcount함수를 쓰면 바로 계산할 수 있다. 하지만 이 함수는 gcc 환경에서만 쓸 수 있으므로 컴파일 환경을 보고 사용하도록 하자.
'Solved problems' 카테고리의 다른 글
BOJ 2888 상범 게임 (0) | 2020.05.28 |
---|---|
BOJ 4384 공평하게 팀 나누기 (1) | 2020.05.26 |
BOJ 1742 레이싱 결과 (0) | 2020.05.25 |
BOJ 1040 정수 (0) | 2020.05.24 |
BOJ 1176 섞기 (0) | 2020.05.24 |
Comments