문제 설명

풀이

dp[현재 사람][이전까지 수행한 일의 상태] = 현재 일의 상태까지의 최솟값

이 문제는 비트마스크와 dp를 이용하여 풀이할 수 있다. 이전까지 수행한 일의 상태를 0011 -> 1, 2번이 일을 한 상태와 같이 비트를 이용하여 상태를 표시한다.

코드

#include <cstdio>
#include <cstring>

int d[22][22];
int dp[22][1 << 19];
int N;

int min(int a, int b) { return a > b ? b : a; }

int dpf(int cur, int state) {
    int &ret = dp[cur][state];
    //모든 일을 한 상황 ex) n = 3일때 1000 - 1 = 0111
    if (state == (1 << N) - 1) return 0;
    if (ret != -1) return ret;
    int ans = 1e9;
    for (int i = 0; i < N; i++) {
        if ((state & (1 << i)) == 0) {
            ans = min(ans, dpf(cur + 1, state | (1 << i)) + d[cur][i]);
        }
    }
    return ret = ans;
}

int main() {
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            scanf("%d", &d[i][j]);
    memset(dp, -1, sizeof(dp));
    printf("%d", dpf(0, 0));
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[1086] 박성원  (0) 2021.07.04
백준[2098] 외판원 순회  (4) 2021.07.03
백준[11723] 집합  (0) 2021.07.03
백준[1069] 집으로  (0) 2021.07.01
백준[7869] 두 원  (0) 2021.06.30
복사했습니다!