[BOJ] μΈνμ μν(2098)
[λ°±μ€(BOJ)] μΈνμ μν(2098) C++
λ¬Έμ : BOJ_2098λ² μΈνμ μν
λ¬Έμ μ€λͺ
λΉνΈλ§μ€νΉ
n κ°μ μ¬νμ§κ° μμ λ, κ° μ¬νμ§μμ λ€λ₯Έ μ¬νμ§λ‘ κ° μ μλ λΉμ©μ΄ μ£Όμ΄μ§λλ€.
μ΄λ λΉμ©μ μ΅μνμΌλ‘ ν΄μ μΆλ°ν μ¬νμ§μμ λͺ¨λ μ¬νμ§λ₯Ό λ°©λ¬Έν λ€ λ€μ μΆλ°ν μ¬νμ§λ‘ λμμ€λ λΉμ©μ ꡬνλ λ¬Έμ μ
λλ€.
μ΄λ ν λ² λ°©λ¬Ένλ μ¬νμ§λ λ€μ λ°©λ¬Έν μ μμ΅λλ€.
λΉνΈ λ§μ€νΉ μΈμλ μ¬λ¬ κ°μ§ λ°©λ²μΌλ‘ ν΄κ²°ν μ μλ μ λͺ
ν λ¬Έμ μ
λλ€.
μ¬νμ§μ μκ° μ΅λ 16μ΄κΈ° λλ¬Έμ 16κ°μ μ리μλ₯Ό λ§λ€κ³ λΉνΈ μ°μ°μΌλ‘ λ°©λ¬Έν μ¬νμ§λ₯Ό 체ν¬νλ λ°©μμΌλ‘ λΉνΈ λ§μ€νΉμΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
Solution
recursion ν¨μλ₯Ό λ§λ€μ΄ μ€λλ€.
μ΄λ, ν¨μμ λ΄μ©μ recursion(νμ¬ λμ
, λ°©λ¬Έν λμλ€
)μ
λλ€.
μ΄λ ν¨μμ λ λ²μ§Έ μΈμμΈ λ°©λ¬Έν λμλ€μ λν΄μ λ°°μ΄μ ν λΉνλ κ²μ΄ μλ 16μ리μ λΉνΈ μ°μ°μλ‘ λ°©λ¬Έν λμμ μ 보λ₯Ό μ λ¬ν΄ μ£Όμ΄μΌ ν©λλ€.
νμ¬ λμμμ for λ¬Έμ μννμ¬ κ° μ μλ μ¬νμ§λ‘ λ€μ μ¬κ·λ‘ λ€μ΄κ°κ³ , λΉνΈ λ§μ€νΉμΌλ‘ λͺ¨λ λμμ λ°©λ¬Ένμμ νμΈν λ€, κ·Έ νμ¬ λμμμ μ²μ λμλ‘ μ΄λν μ μλ€λ©΄ λͺ¨λ λΉμ©μ return ν΄ μ€λλ€.
κ°κ°μ λμλ₯Ό λ°©λ¬Έν λμ λΉμ©μ νμ¬ λΉμ©μμ + ν΄μ£Όλ©° μ¬κ·λ₯Ό νκ³ , μ΄ μμΈ κ°λ€μ νμ min ν¨μλ‘ μ΅μκ°μ ꡬνλλ‘ νμ¬ μ΅μ’
κ°μ΄ μ΅μκ° λμ€κ² ν΄μΌ ν©λλ€.
Description
vis == (1 << N) - 1)
첫 λ²μ§Έ λ°©λ¬Έν λμλ₯Ό 0λ²μ§Έλ‘ μ§μ νκΈ° λλ¬Έμ ν΄λΉ μ‘°κ±΄μ΄ λͺ¨λ λμλ₯Ό λ°©λ¬Έν 쑰건μ λλ€.vis & (1 << i)
"&"λ₯Ό νμ©ν΄ νμ¬ μ‘°κ±΄μ΄ i λ² μ§Έ λμλ₯Ό λ°©λ¬Έν μνμΈμ§ νμΈν μ μμ΅λλ€.memset(dp, -1, sizeof(dp))
dp λ©λͺ¨μ μ΄μ μ μν΄μ λͺ¨λ dp κ°μ -1λ‘ μ΄κΈ°νν΄μ€λλ€.
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 9999999999
using namespace std;
int N;
int map[16][16];
int dp[16][1 << 16];
int recursion(int now, int vis) {
int &ret = dp[now][vis];
if (ret != -1) return ret;
if (vis == (1 << N) - 1) {
if (map[now][0] != 0) return map[now][0];
else return INF;
}
ret = INF;
for (int i = 0; i < N; i++) {
if (vis & (1 << i) || map[now][i]==0) continue;
ret = min(ret, recursion(i, vis | (1 << i)) + map[now][i]);
}
return ret;
}
int main(void) {
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
memset(dp, -1, sizeof(dp));
cout << recursion(0, 1) << '\n';
return 0;
}