λ¬Έμ : boj.kr/2098
λ μ§: 09/16 (μ)
μ±κ³΅μ¬λΆ: X
μΈνμ μν(TSP)λ nκ°μ λμκ° μκ³ κ° λμλ₯Ό μ΄μ΄μ£Όλ κΈΈκ³Ό κ° κΈΈμ λν λΉμ©μ΄ μμ λ μΈνμμ΄ λͺ¨λ λμλ₯Ό λμ λ€μ μΆλ°ν λμλ‘ λμμ€λ μ΅μ λΉμ©μ ꡬνλ λ¬Έμ μ΄λ€.
DPμ λνμ μΈ λ¬Έμ μμ μκ³ μμμΌλ, κ²°κ΅ μ΄λ»κ² νΈλμ§ λͺ°λΌ μ€ν¨νλ€.
μμ νμ
κ°μ₯ λ¨Όμ μκ°ν΄λ³Ό μ μλ μκ³ λ¦¬μ¦μ΄λ€. Nμ΄ 16μ΄λ€.
λͺ¨λ λμκ° μλ‘ μ΄μ΄μ Έμλ€κ³ κ°μ νκ³ ν λμ μ€ νλλ₯Ό κ³¨λΌ μΆλ°νμ¬ κ·Έ λμλ₯Ό μ μΈνκ³ λλ¨Έμ§ λμλ₯Ό κ³ λ₯΄κ³ λ λλ¨Έμ§ λμλ₯Ό κ³ λ₯΄κ³ ... μ΄λ₯Ό λ°λ³΅νμ¬ μ΄ 16κ° λμλ₯Ό μ λΆ λκ³ λ€μ μ²μ λμλ‘ λμμ€λ κ²½μ°μ μλ
16C1 * 15C1 * 14C1 * ... * 1C1 * 1C1(μ²μ λμλ‘ λμκ°) = 16!μ΄λ€.

16!μ κ°μ ν°λ¬΄λμμ΄ ν° κ°μμ μμ μ¬μ§μ ν΅ν΄ μ μ μλ€.. κ·ΈλΌ μ΄ κ²½μ°μ μλ₯Ό μ΅λν μ€μ¬μΌνλ€. κ·Έλ¬κΈ° μν΄μ κ²½μ°μ μλ₯Ό μ‘°κΈ λΆμν΄λ³΄μ. μλ₯Ό λ€μ΄ 7κ°μ λμκ° μκ³ 1μμ μΆλ°νλ€κ³ νμ.
1 → 2 → 3 → 4 → 5 → 6 → 7 → 1
μ²μμ ν΄λΉ κ²½λ‘λ‘ μΈνμμ΄ μνλ₯Ό λ§μ³€λ€. κ·Έλ¦¬κ³ λμ λ€μ κ²½λ‘λ‘ μ΄λμ νλ€.
1 → 2 → 3 → 4 → 7 → 5 → 6 → 1
7 → 5 → 6 → 1λ‘ μ΄λν κ²μ μμ κ²½μ°μ λ€λ₯΄κ² μ΄λνμΌλ μ΄ μ μ κ²½λ‘μΈ 1 → 2 → 3 → 4 μ΄λμ μ¬μ€ μ²μ μ΄λν κ²½μ°μ κ²ΉμΉλ€! κ·ΈλΌμλ λΆκ΅¬νκ³ νλ² λ λ°©λ¬Ένμ¬ κ΄ν νμ λλΉνκ³ μλ€.
μΈνμμ΄ μ²μ κ²½λ‘λ‘ μνλ₯Ό νκ³ μ μ§λμ 1 → 2 → 3 → 4λ‘ κ°λ λΉμ©μ μ΄ν©μ μ μ΄λκ³ λ λ²μ§Έ κ²½λ‘λ‘ μ΄λν λ 1 → 2 → 3 → 4 κ²½λ‘λ μ€ν΅νκ³ 4λ²μ§Έ λμλΆν° 7 → 5 → 6 → 1 κ²½λ‘λ‘λ§ μ΄λνλ©΄ νμ μλ μ μμν λ° λ§μ΄λ€.
λ°λ‘ μ΄λ λ¬Έμ νμ΄μ DPμ λ©λͺ¨μ΄μ μ΄μ μ μ¬μ©νλ€λ ννΈλ₯Ό μ»μ μ μλ€. κ½€ ν° ννΈλ₯Ό μ»μλ€!
DPλ‘ μ κ·Όνμ!
κ·ΈλΌ, μ΄μ κ° κ²½λ‘μ μμλ³λ‘ λΉμ©μ μ΄ν©μ μ μ₯ν΄λκ³ νμ©νλ©΄ μ€λ³΅λλ κ²½λ‘κ° κ½€ μμ΄μ§λ―λ‘ κ²½μ°μ μκ° λ§μ΄ μ€μ΄λ€ κ² κ°λ€. νμ§λ§, κΌ κ²½λ‘μ μμλ³λ‘ λΉμ©μ μ΄ν©μ μ μ₯ν΄μΌν κΉ?
μ΄λ₯Ό μμ보기 μν΄ 1 → 2 → 3 → 4 → 5 → 6 → 7 → 1 κ²½λ‘λ₯Ό μ’ λ λΆμν΄λ³΄μ. μ¬μ€ μ΄ κ²½λ‘λ 2 → 3 → 4 → 5 → 6 → 7 → 1 → 2 κ²½λ‘μ μ΄ν©μ΄ κ°κ³ 3 → 4 → 5 → 6 → 7 → 1 → 2 → 3 κ²½λ‘μ μ΄ν©μ΄ κ°λ€.
μ¦,
1 → 2 → 3 → 4 → 5 → 6 → 7 → 1 == 2 → 3 → 4 → 5 → 6 → 7 → 1 → 2
== 3 → 4 → 5 → 6 → 7 → 1 → 2 → 3 == ...
== 7 → 1 → 2 → 3 → 4 → 5 → 6 → 7
μ΄λ€! μ΄ λ§μ μ¦, λ΄κ° μ΄λ€ λμμμ μΆλ°μ νλ κ²°κ΅ μ΅μ λΉμ©μΌλ‘ κ°λ κ²½λ‘λ λͺ¨λ κ°μ κ²½λ‘λΌλ μ μ΄λ€.
μ΄λ° μκ°μ κ°κ³ μλ λ κ²½μ°μ μλ₯Ό 보μ.
1 → 2 → 3 → 4 → 7 → 5 → 6 → 1
2 → 3 → 4 → 7 → 5 → 6 → 1 → 2
λ λ²μ§Έ κ²½μ°μμ λ§μ½ λ΄κ° 4 λμμ μμ λ 1, 2, 3 λμλ₯Ό κ±°μ³μλ€κ³ ν΄λ³΄μ. κ·ΈλΌ 2 → 3 → 4 → ... → 1 → 2 κ²½λ‘λΌμ μμκ° μκ΄μμ΄ λ³΄μ΄μ§λ§ κ·Έλ₯ 1λΆν° μΆλ°νλ€κ³ 보면 1 → 2 → 3 → 4 μ΄λ―λ‘ λ€μ 7 → 5 → 6μ λν μ΄ν©λ§ ꡬν΄μ£Όκ³ 1 λμλ‘ λμκ°λ©΄ 첫 κ²½μ°μ κ°λ€!!! μ¦, λ΄κ° λ°©λ¬Έν κ²μ΄ μ΅μ λΉμ©μ κ²½λ‘λΌλ©΄ λ°©λ¬Έμ μμκ° μκ΄μ΄ μλ€λ λ»μ΄λ€.
κ·ΈλΌ, λλ μ΄ κ²½λ‘λ₯Ό μ μ₯ν λ λ°©λ¬Έμ μμ μκ΄μμ΄ κ·Έμ μ΄λ€ λμλ₯Ό λ°©λ¬Ένλμ§λ§ νμνλ©΄ λλ€! μ΄λ₯Ό νμνκΈ° μν΄μ visited λ°°μ΄, μ§ν© λ± μ¬λ¬κ°μ§κ° μκ² μ§λ§ μ¬κΈ°μλ μ°μ°μ μλλ₯Ό λλμ± μ€μ¬λ³΄κΈ° μν΄ λΉνΈλ§μ€νΉ κΈ°μ μ μ¬μ©νλ€. μ΄ 16κ°μ λμμ΄λ―λ‘ 16κ°μ λΉνΈμ κ°κ° 1, 2, 3, 4, 5, 6, ..., 16 λμλ‘ λ³΄κ³ 0 λλ 1λ‘ λ°©λ¬Έ νμλ₯Ό νλ κ²μ΄λ€.
κ·ΈλΌ λ§μ§λ§μΌλ‘ λ¨μ μλ¬Έμ DPμ μ΄λ»κ² μ μ₯νλκ°μ΄λ€. μ¬κΈ°μ μ’ μ΄ν΄νλλ° μ λ₯Ό λ¨Ήμμ§λ§ μμ μ€λͺ μ μ 보μλ€λ©΄ μ΄ν΄ν μ μμ κ²μ΄λ€. νμ¬ μμΉμμ μ§λμ¨ λμλ€μ λν μ΄ν©μ DPμ μ μ₯ν΄μΌνλκΉ μμ κ²½μ° 4μμ 1 → 2 → 3 → 4κΉμ§μ ν©μ DPμ μ μ₯νλ€κ³ νλ©΄ dp[4][00...1111] = sum; μ΄ λ¨μ μ μ μλ€. κ·ΈλΌ 1μ°¨μ λ°°μ΄μλ λμμ κ°μ n, 2μ°¨μ λ°°μ΄μλ 2^n-1 λ§νΌμ ν¬κΈ°κ° νμν¨μ μ μ μλ€. μ¦, DP[n][2^n-1] μΌλ‘ DP λ°°μ΄μ μ μΈνλ€.
μμ μ¬μ€μ λͺ¨λ μ΄ν΄νλ©΄ μ΄λμ λ μνμ°©μ€ λμ μλ μ½λλ₯Ό μμ±ν μ μμ κ²μ΄λ€.
μ½λ
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[][] w;
static int[][] dp;
// Math.min μ¬μ©μ μν΄ Integer.MAX_VALUE;λ‘ μ΄κΈ°ννλ©΄ μλλ€.
// if (visited == (1 << n) - 1) ν΄λΉ 쑰건μμ κ° μ μλ€λ©΄ μ΅λκ°μ μ£Όμ΄ ν΄λΉ κ°μ΄ μ΅μκ°μΌλ‘ κ°±μ λμ§ μλλ‘ νλλ°,
// 리ν΄λ Integer.MAX_VALUE κ°μ΄ int cost = tsp(i, visited | (1 << i)) + w[here][i]; μ¬κΈ°μ λν΄μ§κΈ° λλ¬Έμ Overflowκ° λ°μνλ€.
// κ·Έλμ, λλ 16κ°μ λμλ₯Ό λΉ λλ©΄ μ΄ 17κ°μ λμλ₯Ό λ°©λ¬Ένλλ° κ° κΈΈμ λΉμ© μ΅λκ°μ΄ 100λ§μ΄λ―λ‘ 1700λ§ + 1μ μ΅λκ°μΌλ‘ μ€μ ν΄μ£Όμλ€.
static int inf = 17000001;
static int tsp(int here, int visited) {
if (visited == (1 << n) - 1) return (w[here][0] != 0) ? w[here][0] : inf;
if (dp[here][visited] != 0) return dp[here][visited];
dp[here][visited] = inf;
for (int i = 0; i < n; i++) {
if ((visited & (1 << i)) != 0) continue;
if (w[here][i] == 0) continue;
int cost = tsp(i, visited | (1 << i)) + w[here][i];
dp[here][visited] = Math.min(cost, dp[here][visited]);
}
return dp[here][visited];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
w = new int[n][n];
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++)
w[i][j] = Integer.parseInt(st.nextToken());
}
dp = new int[n][(1 << n) - 1];
System.out.println(tsp(0, 1));
}
}
'μκ³ λ¦¬μ¦ λ¬Έμ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
2294λ² λ¬Έμ λ©λͺ¨ (0) | 2024.09.22 |
---|---|
2240 - μλλ무 (0) | 2024.09.20 |
2565 - μ κΉμ€ (0) | 2024.09.12 |
1561 - λμ΄ κ³΅μ (2) | 2024.09.09 |
2156 - ν¬λμ£Ό μμ (0) | 2024.08.30 |