π λ°±μ€ 1010 λ¬Έμ https://www.acmicpc.net/problem/1010
λ¬Έμ
μ¬μμ΄λ ν λμμ μμ₯μ΄ λμλ€. μ΄ λμμλ λμλ₯Ό λμͺ½κ³Ό μμͺ½μΌλ‘ λλλ ν° μΌμ§μ λͺ¨μμ κ°μ΄ νλ₯΄κ³ μλ€. νμ§λ§ μ¬μμ΄λ λ€λ¦¬κ° μμ΄μ μλ―Όλ€μ΄ κ°μ 건λλλ° ν° λΆνΈμ κ²ͺκ³ μμμ μκ³ λ€λ¦¬λ₯Ό μ§κΈ°λ‘ κ²°μ¬νμλ€. κ° μ£Όλ³μμ λ€λ¦¬λ₯Ό μ§κΈ°μ μ ν©ν κ³³μ μ¬μ΄νΈλΌκ³ νλ€. μ¬μμ΄λ κ° μ£Όλ³μ λ©΄λ°ν μ‘°μ¬ν΄ λ³Έ κ²°κ³Ό κ°μ μμͺ½μλ Nκ°μ μ¬μ΄νΈκ° μκ³ λμͺ½μλ Mκ°μ μ¬μ΄νΈκ° μλ€λ κ²μ μμλ€. (N β€ M)
μ¬μμ΄λ μμͺ½μ μ¬μ΄νΈμ λμͺ½μ μ¬μ΄νΈλ₯Ό λ€λ¦¬λ‘ μ°κ²°νλ €κ³ νλ€. (μ΄λ ν μ¬μ΄νΈμλ μ΅λ ν κ°μ λ€λ¦¬λ§ μ°κ²°λ μ μλ€.) μ¬μμ΄λ λ€λ¦¬λ₯Ό μ΅λν λ§μ΄ μ§μΌλ €κ³ νκΈ° λλ¬Έμ μμͺ½μ μ¬μ΄νΈ κ°μλ§νΌ (Nκ°) λ€λ¦¬λ₯Ό μ§μΌλ €κ³ νλ€. λ€λ¦¬λΌλ¦¬λ μλ‘ κ²Ήμ³μ§ μ μλ€κ³ ν λ λ€λ¦¬λ₯Ό μ§μ μ μλ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ.
μ λ ₯
μ λ ₯κ³Ό 첫 μ€μλ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ·Έ λ€μ μ€λΆν° κ°κ°μ ν μ€νΈ μΌμ΄μ€μ λν΄ κ°μ μμͺ½κ³Ό λμͺ½μ μλ μ¬μ΄νΈμ κ°μ μ μ N, M (0 < N <= M < 30) μ΄ μ£Όμ΄μ§λ€.
μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€μ λν΄ μ£Όμ΄μ§ 쑰건 νμ λ€λ¦¬λ₯Ό μ§μ μ μλ κ²½μ°μ μλ₯Ό μΆλ ₯νλ€.
νμ΄
μΌλ¨ μ΄ λ¬Έμ λ₯Ό λ± λ΄€μλ λ κ²½μ°μ μμ μ€λ³΅μ΄ νλ½λμ§ μλλ€λ λΆλΆμμ μ‘°ν©μ λ μ¬λ Έλ€.
μ‘°ν©
n κ°μ μμ μ€ μμλ₯Ό κ³ λ €νμ§ μλ κ²½μ°μ μ. μ¦, μ€λ³΅μ μ κ±°ν μμ΄μ΄λΌκ³ λ³Ό μ μλ€.
nCr = nββCrββ + nββCr
μ‘°ν©μ μμ κ°μ 곡μμ κ°κ³ μλλ° μ΄λ,
νλμ μμλ₯Ό μ νν κ²½μ° + νλμ μμλ₯Ό μ ννμ§ μμ κ²½μ°λ‘ λνλΌ μ μλ€.
μλ₯Ό λ€λ©΄ [1, 2, 3, 4, 5] κ° μμ λ 3κ°λ₯Ό λ½λ κ²½μ°λ₯Ό ꡬνλ€κ³ νλ©΄
- 5λ₯Ό 미리 μ νν κ²½μ° : λ¨μ μ [1, 2, 3, 4]. μ νλ μ [5]
- λ¨μ μ μ€ 2κ°λ₯Ό μ νν μ μλ κ²½μ° = [1, 2, 5], [1, 3, 5], [1, 4, 5], [2, 3, 5], [2, 4, 5], [3, 4, 5]. μ΄ 6κ°
- 5λ₯Ό μ ννμ§ μμ κ²½μ° : λ¨μ μ [1, 2, 3, 4]
- λ¨μ μ μ€ 3κ°λ₯Ό μ νν μ μλ κ²½μ° = [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]. μ΄ 4κ°
μ¦, 5Cr = 4C2 + 4C3 = 10κ°κ° λλ€.
λ½μμΌ ν κ°μμΈ rμ΄ 0μ΄ λλ©΄ μ νμ μ¬μ§κ° μμΌλ―λ‘ 1μ 리ν΄μν¨λ€.
μ 체 κ°μμ λ½μμΌ ν κ°μκ° κ°λ€λ©΄ μ΄ λν μ νμ μ¬μ§κ° μμΌλ―λ‘ 1μ 리ν΄μν¨λ€.
κ·Έλ¦¬κ³ 0.5 μ΄λΌλ μκ° μ νμ΄ μκΈ°μ Dynamic Programming μκ³ λ¦¬μ¦ κΈ°λ²μ Top-down μ νμ©νμ¬ μν μκ° ν¨μ¨μ±μ ν₯μμμΌμ£Όμλ€.
λμ κ³νλ² Dynamic Programming
DP μκ³ λ¦¬μ¦ κΈ°λ²μ μ΄λ―Έ κ³μ°λ κ²°κ³Όλ₯Ό λ³λμ λ©λͺ¨λ¦¬ μμμ μ μ₯νμ¬ λ€μ κ³μ°νμ§ μλλ‘ μ€κ³νμ¬ μν μκ° ν¨μ¨μ±μ ν₯μμν€λ λ°©λ²μ΄λ€.
Top-down νν₯μ
μμ λ¬Έμ ν΄κ²°μ μν΄ νμ λ¬Έμ λ₯Ό μ¬κ·λ‘ νΈμΆνμ¬ νμ λ¬Έμ λΆν° μμ λ¬Έμ κΉμ§ μμ°¨μ μΌλ‘ ν΄κ²°νλ λ°©μ. ν΄κ²°ν΄λμ νμ λ¬Έμ λ₯Ό μ μ₯νκΈ° μν΄ Memoizationμ΄ μ¬μ©λλ€.
Memoization
νλ² κ³μ°ν κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬ 곡κ°μ λ©λͺ¨νλ κΈ°λ².
λ©λͺ¨μ΄μ μ΄μ μ¬μ©μ ν΅ν΄ λͺ¨λ λ¬Έμ κ° λ¨ νλ²μ©λ§ κ³μ°λλ€κ³ 보μ₯λκΈ°μ ν¨μ νΈμΆ νμκ° κ°μλλ€.
λ΄κ° νΌ μ½λ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static final int[][] dp = new int[30][30]; // λ©λͺ¨μ΄μ μ΄μ
μν νλ ¬, ꡬν κ°μ λ°λ‘ μ μ₯ν΄λλ€
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
bw.write(recursive(M, N) + "\n");
}
bw.flush();
bw.close();
}
// M μμ Nμ λ½λ κ²½μ°μ μ
private static int recursive(int n, int r) {
/**
* λ©λͺ¨μ΄μ μ΄μ
O(n)
* νλ² κ΅¬ν κ°μ μ μ₯λ κ° λ¦¬ν΄
*/
if (dp[n][r] > 0) {
return dp[n][r];
}
else if (n == r || r == 0) {
return dp[n][r] = 1;
}
else {
/**
* Combination μ‘°ν©
* nCr = n-1Cr-1 + n-1Cr
* (n-1Cr-1) : νλμ μμλ₯Ό μ νν κ²½μ°
* (n-1Cr) : νλμ μμλ₯Ό μ ννμ§ μμ κ²½μ°
*/
return dp[n][r] = recursive(n - 1, r - 1) + recursive(n - 1, r);
}
}
}
μ°Έκ³ λΈλ‘κ·Έ https://woongsios.tistory.com/179 https://loosie.tistory.com/150