알고리즘/DP
2020. 6. 7.
비트마스킹 DP
비트마스킹을 이용해 DP문제를 풀어봅시다. \(n\)크기의 집합이 있을 때, 이 집합의 서로 다른 부분집합의 개수는 \(2^n\)가지 입니다. 그리고 이 부분집합들을 하나의 정수로 쉽게 변환할 수 있습니다. 어떻게 하면 될까요? 5개의 원소를 가진 집합 \(S\)가 있다고 가정해봅시다. \(S = \{1,2,3,4,5\}\) \(S\)의 모든 부분집합에 대해서, 각 원소가 존재하지 않으면 \(0\), 존재하면 \(1\)을 차례대로 써 넣어봅시다. 그러면 서로 다른 5자리 이진수가 될 텐데, 이 수를 보통의 10진수로 변환하면 \([0,15]\)의 범위를 가지는 서로 다른 수로 변환됩니다. 원소의 수가 32개 이하라면 int범위에, 64개 이하라면 long long 범위에 저장할 수 있고, 만약 원소의 수..