for each bit i not in mask: if (조건(mask, last, extra, i)) { newMask = mask | (1<<i); newLast = i; // 필요하면 newExtra = update(...);// 필요하면 dp[newMask][newLast][newExtra] = max/min( dp[newMask][newLast][newExtra], dp[mask][last][extra] + delta ); }
Bitmask DP for Assignment
for(int mask = 0; mask < FULL; ++mask){ // 지금까지 배정된 사람 수 = popcount(mask) int k = __builtin_popcount(mask); // 다음 사람 k 에게 할당할 일 j 탐색 for(int j = 0; j < N; ++j){ if( (mask & (1 << j)) == 0 ){ int next = mask | (1 << j); dp[next] = min(dp[next], dp[mask] + cost[k][j]); } } }