π λ¬Έμ λ§ν¬: λ°±μ€ 11964λ² - Hot Dogs?
T
κ° μ£Όμ΄μ§κ³ , λ κ°μ§ μ μ νλ λ°©λ² A
, B
κ° μ£Όμ΄μ§λ€.A
μ λλ B
μ μ μ»μ μ μμ./2
μ°μ°μ ν λ²λ§ μν κ°λ₯ (νμ¬ μ μλ₯Ό μ λ°μΌλ‘ μ€μ΄λ κ²).T
μ΄νμμ μ΅λ μ μλ₯Ό ꡬνλ λ¬Έμ .μ²μμλ DPλ‘ ν΄κ²°μ μλνμΌλ, μ΅μ λΆλΆ ꡬ쑰(Optimal Substructure) λ₯Ό λ§μ‘±νμ§ μμ μ€ν¨.
/2
μ°μ°μ΄ λΉμ νμ μΈ λ³νλ₯Ό λ§λ€λ©°, μ΄μ μνμ μ΅μ ν΄λ₯Ό μ¬μ¬μ©ν μ μμ.dp[i] = max(dp[i - A], dp[i - B], dp[i / 2])
κ°μ μ νμμ λ§λ€ μ μμ.BFSλ₯Ό νμ©νλ©΄, μ΅μνμ μ°μ°μΌλ‘ μ΅λ μ μλ₯Ό μ°Ύμ μ μμ.
Queue<int[]>
λ₯Ό μ¬μ©νμ¬ νμ (νμ¬ μ μ, /2 μ°μ° μ¬μ© μ¬λΆ
).A
λλ B
λ₯Ό λν κ°μ΄ T
μ΄νμΈμ§ νμΈ ν νμ μΆκ°./2
μ°μ°μ μμ§ μ¬μ©νμ§ μμλ€λ©΄ ν λ²λ§ μ€ν κ°λ₯.answer
)λ₯Ό κ³μ κ°±μ νλ©° BFS νμ μ§ν.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
private static StringTokenizer st;
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static int T, A, B;
private static boolean[][] visited; // [νμ¬ μ μ][/2 μ°μ° μ¬μ© μ¬λΆ]
public static void main(String[] args) throws IOException {
st = new StringTokenizer(br.readLine());
T = Integer.parseInt(st.nextToken());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
visited = new boolean[T + 1][2]; // μ΅λ TκΉμ§ νμ
int answer = 0;
Queue<int[]> queue = new ArrayDeque<>();
queue.add(new int[]{0, 0}); // (νμ¬ μ μ, /2 μ°μ° μ¬μ© μ¬λΆ)
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int point = cur[0];
int isDrink = cur[1];
answer = Math.max(answer, point); // μ΅λ μ μ κ°±μ
if (answer == T) break; // μ΅λ μ μμ λλ¬νλ©΄ μ’
λ£
// A μ μλ₯Ό μΆκ°ν μ μλ κ²½μ°
if (point + A <= T && !visited[point + A][isDrink]) {
visited[point + A][isDrink] = true;
queue.add(new int[]{point + A, isDrink});
}
// B μ μλ₯Ό μΆκ°ν μ μλ κ²½μ°
if (point + B <= T && !visited[point + B][isDrink]) {
visited[point + B][isDrink] = true;
queue.add(new int[]{point + B, isDrink});
}
// /2 μ°μ°μ μμ§ μ¬μ©νμ§ μμλ€λ©΄ ν λ²λ§ μ€ν κ°λ₯
if (isDrink == 0 && !visited[point / 2][1]) {
visited[point / 2][1] = true;
queue.add(new int[]{point / 2, 1});
}
}
System.out.println(answer);
}
}
/2
μ°μ° λ°©μ§ /2
μ°μ°μ μ μ©ν λ, point / 2 == point
μ΄λ©΄ νμ λ£μ νμ μμ. (0, 1, 2 λ±)visited[point][isDrink]
λ₯Ό μ¬μ©νμ¬ μ€λ³΅ λ°©λ¬Έ λ°©μ§.λ°©λ² | μκ°λ³΅μ‘λ | μ΅μ ν΄ λ³΄μ₯ | μ€λͺ |
---|---|---|---|
DP | π« λΆκ°λ₯ | π« 보μ₯ X | /2 μ°μ°μ΄ λΉμ νμ μ΄λΌ μ νμμ λ§λ€ μ μμ |
BFS | β
O(T log T) | β μ΅μ ν΄ λ³΄μ₯ | μ΅λ¨ κ²½λ‘ νμ λ°©μμΌλ‘ μ νν μ λ΅ λμΆ κ°λ₯ |
π« μ΅μ λΆλΆ ꡬ쑰 (Optimal Substructure)λ₯Ό λ§μ‘±νμ§ μμ
π« μ€λ³΅ λΆλΆ λ¬Έμ (Overlapping Subproblems)λ₯Ό νμ©ν μ μμ
β
λ°λΌμ, BFSλ‘ ν΄κ²°ν΄μΌ ν¨.
Queue<int[]>
λ₯Ό νμ©ν μν νμ visited[][]
μ μ¬μ©νμ¬ μ€λ³΅ νμ λ°©μ§