BOJ 2098번 외판원 순회 ( DP ) JAVA
풀이
dp 와 비트마스킹이 합쳐진 문제였습니다.
visit 배열을 따로 선언하지 않고, 비트마스킹을 이용하여 문제를 풀이하는 것이 첫 번째 포인트였고, 어떤 노드에서 시작하건, 결국 최솟값은 같다는 것을 알아차리는 것이 두번째 포인트였던 것 같습니다.
링크
https://www.acmicpc.net/problem/2098
소스 코드
package boj;
import java.util.Arrays;
import java.util.Scanner;
public class Boj2098 {
static int[][] a;
static int[][] dp;
static final int INF = 16 * 1_000_000;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
a = new int[n][n];
dp = new int[n][1 << n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = sc.nextInt();
}
}
for (int i = 0; i < n; i++) {
Arrays.fill(dp[i], INF);
}
int res = tsp(0, 1, n);
System.out.println(res);
}
// cur 에서의 방문한 곳들이 visit대로인 상태에서, 모두 돌아 나에게까지로 오는 최단거리를 return 한다.
public static int tsp(int cur, int visit, int n) {
if (visit == (1 << n) - 1) {
if (a[cur][0] == 0)
return INF;
else
return a[cur][0];
}
if (dp[cur][visit] != INF)
return dp[cur][visit];
for (int next = 0; next < n; next++) {
//
if ((visit & (1 << next)) == 0 && a[cur][next] != 0) {
dp[cur][visit] = Math.min(dp[cur][visit], tsp(next, visit | 1 << next, n) + a[cur][next]);
}
}
return dp[cur][visit];
}
}
'Algorithm' 카테고리의 다른 글
BOJ 5014번 스타트링크 ( BFS ) JAVA (0) | 2021.04.07 |
---|---|
BOJ 2169번 로봇 조종하기 ( DP ) JAVA (0) | 2021.04.06 |
BOJ 5557번 1학년 ( DP ) JAVA (0) | 2021.04.05 |
BOJ 1958번 LCS 3 ( DP ) JAVA (0) | 2021.04.04 |
BOJ 1747번 소수&팰린드롬 ( 에라토스테네스의 체 & 스택 ) JAVA (0) | 2021.04.04 |