π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.1010 λ€λ¦¬ λκΈ° λ¬Έμ νμ΄ - java
π λ¬Έμ
https://www.acmicpc.net/problem/1010
μ¬μμ΄λ ν λμμ μμ₯μ΄ λμλ€. μ΄ λμμλ λμλ₯Ό λμͺ½κ³Ό μμͺ½μΌλ‘ λλλ ν° μΌμ§μ λͺ¨μμ κ°μ΄ νλ₯΄κ³ μλ€.
νμ§λ§ μ¬μμ΄λ λ€λ¦¬κ° μμ΄μ μλ―Όλ€μ΄ κ°μ 건λλλ° ν° λΆνΈμ κ²ͺκ³ μμμ μκ³ λ€λ¦¬λ₯Ό μ§κΈ°λ‘ κ²°μ¬νμλ€.
κ° μ£Όλ³μμ λ€λ¦¬λ₯Ό μ§κΈ°μ μ ν©ν κ³³μ μ¬μ΄νΈλΌκ³ νλ€. μ¬μμ΄λ κ° μ£Όλ³μ λ©΄λ°ν μ‘°μ¬ν΄ λ³Έ κ²°κ³Ό κ°μ
μμͺ½μλ Nκ°μ μ¬μ΄νΈκ° μκ³ λμͺ½μλ Mκ°μ μ¬μ΄νΈκ° μλ€λ κ²μ μμλ€. (N β€ M)
μ¬μμ΄λ μμͺ½μ μ¬μ΄νΈμ λμͺ½μ μ¬μ΄νΈλ₯Ό λ€λ¦¬λ‘ μ°κ²°νλ €κ³ νλ€. (μ΄λ ν μ¬μ΄νΈμλ μ΅λ ν κ°μ λ€λ¦¬λ§ μ°κ²°λ μ μλ€.)
μ¬μμ΄λ λ€λ¦¬λ₯Ό μ΅λν λ§μ΄ μ§μΌλ €κ³ νκΈ° λλ¬Έμ μμͺ½μ μ¬μ΄νΈ κ°μλ§νΌ (Nκ°) λ€λ¦¬λ₯Ό μ§μΌλ €κ³ νλ€. λ€λ¦¬λΌλ¦¬λ μλ‘ κ²Ήμ³μ§ μ μλ€κ³ ν λ
λ€λ¦¬λ₯Ό μ§μ μ μλ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ.
π μ κ·Όλ²
Q.1010 λ€λ¦¬ λκΈ° λ¬Έμ νμ΄μ λλ€.
λ¬Έμ μμ μ£Όμ΄μ§ 쑰건 μ€ κ°μ₯ μ€μν μ μ
λ€λ¦¬κ° μκ°λ¦¬κ² κ³μΉμ§μμμΌ νλ€λ κ²μ λλ€!
λ€λ¦¬κ° μκ°λ¦¬μ§ μκ² λ€λ¦¬λ₯Ό λ§λλ €λ©΄ κ²½μ°μ μλ n<=m μΌλλ§ μ±λ¦½νκ³
λͺ¨λ 1:1 λμμ΄ λμ΄μν‘λλ€.
κ²°κ³Όμ μΌλ‘ μμμ μκ΄μμ΄ mκ° μ€ nκ°λ₯Ό λ½λ κ²½μ°μ μ (μ‘°ν©)μ΄ λ΅μ΄ λ©λλ€.
mCn = m-1 C r-1 + m C r-1 κ³Ό κ°μ΅λλ€.
μ‘°ν© μ 체 κ²½μ°μμ = μ΄λ€ ν μμλ₯Ό μ΄λ―Έ μ νν κ²½μ° + νλμ μμλ₯Ό μ ννμ§ μμ κ²½μ°μ μ
μ΄λ₯Ό μ΄μ©ν΄ μ¬κ·μ μΌλ‘
public static int combination(int n, int r) {
if (n == r || r == 0)
return 1;
else if(dp[n][r] > 0)
return dp[n][r];
else
return dp[n][r] = combination(n - 1, r - 1) + combination(n - 1, r);
}
combination ν¨μλ₯Ό ν΅ν΄ λ΅μ ꡬν μ μμ΅λλ€.
λ¨ μκ° μμλ₯Ό μ€μ΄κΈ° μν΄
λμ νλ‘κ·Έλλ°μ λ©λͺ¨μ΄μ μ΄μ μ ν΅ν΄ νμ΄ν©λλ€.
π» μ½λ
package problem.dynamic;
import java.io.*;
public class Main_1010 {
static int n,m;
static int T;
static StringBuilder sb;
static int dp[][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
T = Integer.parseInt(br.readLine());
sb = new StringBuilder();
for(int i=0; i<T; i++){
String[] temp = br.readLine().split(" ");
n = Integer.parseInt(temp[0]);
m = Integer.parseInt(temp[1]);
dp = new int[m+1][n+1];
sb.append(combination(m,n)+"\n");
}
bw.write(sb.toString());
br.close();
bw.flush();
bw.close();
}
public static int combination(int n, int r) {
if (n == r || r == 0)
return 1;
else if(dp[n][r] > 0)
return dp[n][r];
else
return dp[n][r] = combination(n - 1, r - 1) + combination(n - 1, r);
}
}