문제: icpc.me/14590
외판원 문제(TSP)와 유사한 문제이다.
외판원 문제는 비트마스크 DP로 해결할 수 있다.
dp[state][pos] <- 현재까지 커버한 상태를 state로 가지고 현재 pos의 위치에 서 있을 때 선수 나열의 최대 길이
점화식은 for(i: 1~n) if(a[pos][i] && !((1<<i)&state)) =>max(dp[state|(1<<i)][i]+1 이 된다.
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 32 33 34 35 36 37 38 39 40 | #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n, a[22][22]; int dp[1 << 21][21]; int func(int state, int pos) { int &ret = dp[state][pos]; if (ret != -1)return ret; ret = 0; for (int i = 1; i <= n; i++) { if (a[pos][i] && !((1 << i)&state)) ret = max(ret, func(state | (1 << i), i) + 1); } return ret; } void tracking(int state, int pos) { for (int i = 1; i <= n; i++) { if (a[pos][i] && !((1 << i)&state)) { if (dp[state][pos] == dp[state | (1 << i)][i] + 1) { printf("%d ", i); tracking(state | (1 << i), i); break; } } } } int main() { scanf("%d", &n); memset(dp, -1, sizeof(dp)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]); } int r = func(1 << 1, 1) ; printf("%d\n1 ", r + 1); int idx = 1; tracking(1 << 1, 1); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)1405 미친 로봇 (0) | 2017.06.07 |
---|---|
BOJ)10838 트리 (0) | 2017.06.07 |
BOJ)13538 XOR 쿼리 (0) | 2017.06.05 |
BOJ)1322 X와K (0) | 2017.06.05 |
BOJ)1837 암호제작 (2) | 2017.06.05 |