그냥 하는 노트와 메모장

BOJ 1410 패턴의 개수 본문

Solved problems

BOJ 1410 패턴의 개수

coloredrabbit 2020. 5. 25. 21:15

* 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