728x90
https://www.acmicpc.net/problem/2098
2098번: 외판원 순회
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[][] map;
static int[][] dp;
static final int INF = 987654321;
public static int dfs(int cur, int visitBit) {
if(visitBit == (1<<N)-1) {
if(map[cur][0] == 0) return INF;
return map[cur][0];
}
if(dp[cur][visitBit] != INF) {
return dp[cur][visitBit];
}
for(int i=0;i<N;i++) {
//i 도시에 방문한 적 없음 && cur -> i에 길 있음
if((visitBit & (1<<i))==0 && map[cur][i] != 0) {
dp[cur][visitBit] = Math.min(dp[cur][visitBit], dfs(i, visitBit|(1<<i))+ map[cur][i]);
}
}
return dp[cur][visitBit];
}
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
dp = new int[N][(1<<N)-1];
StringTokenizer st;
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
for(int j=0;j<N;j++ ) {
map[i][j] = Integer.valueOf(st.nextToken());
}
Arrays.fill(dp[i], INF);
}
int result = dfs(0, 1);
System.out.println(result);
}
}
P 1) 23라인에서 i 도시를 빼줄 때, visitBit | (1<<i)를 해줘야 됨.
처음에 visitBit - (1<<i)로 하였으나, 현재 방문한 도시 중에 i 도시가 없으면 음수가 되어버려서 | 연산으로 해야 됨
P 2) INF 를 Integer.MAX_VALUE 로 두면 안됨..
왜 안돼 .. ㅡㅡ^ 이것 때문에 5 틀림 적립 ㄱㅅ
728x90
'공부 > Algorithms w.Java' 카테고리의 다른 글
프로그래머스 - 타겟 넘버; Java (0) | 2023.06.27 |
---|---|
[Java] 백준 9934 - 완전 이진 트리 (0) | 2022.11.10 |
프로그래머스-게임 맵 최단거리; Java (0) | 2022.03.07 |
프로그래머스-숫자 게임; Java (1) | 2022.02.20 |
프로그래머스-가장 큰 수; Java (0) | 2022.02.20 |