μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[λ°±μ€€ / BOJ 18427] ν•¨κ»˜ 블둝 μŒ“κΈ°

KIMHYEYUN 2021. 9. 14. 21:20
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/18427

 

18427번: ν•¨κ»˜ 블둝 μŒ“κΈ°

첫째 쀄에 μžμ—°μˆ˜ N, M, Hκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 50, 1 ≤ M ≤ 10, 1 ≤ H ≤ 1,000) λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 κ±Έμ³μ„œ 각 학생이 κ°€μ§„ λΈ”λ‘λ“€μ˜ 높이가 곡백을 κΈ°μ€€μœΌλ‘œ ꡬ

www.acmicpc.net

 

문제


1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ 학생듀은 각각 블둝듀을 κ°€μ§€κ³  μžˆλ‹€. ν•™μƒλ§ˆλ‹€ μ΅œλŒ€ M개의 블둝을 κ°€μ§€κ³  μžˆμ„ 수 있으며, ν•œ λͺ…μ˜ 학생이 κ°€μ§€κ³  μžˆλŠ” λͺ¨λ“  λΈ”λ‘λ“€μ˜ λ†’μ΄λŠ” μ„œλ‘œ λ‹€λ₯΄λ‹€. 이 λ•Œ 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ 학생듀이 κ°€μ§„ 블둝을 μ°¨λ‘€λŒ€λ‘œ μ‚¬μš©ν•˜μ—¬ λ°”λ‹₯μ—μ„œλΆ€ν„° μŒ“μ•„μ˜¬λ € ν•˜λ‚˜μ˜ 탑을 λ§Œλ“€κ³ μž ν•œλ‹€.

단, μ–΄λ–€ ν•™μƒμ˜ 블둝은 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ 되며 ν•œ 학생당 μ΅œλŒ€ 1개의 λΈ”λ‘λ§Œμ„ μ‚¬μš©ν•  수 μžˆλ‹€.

1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ 학생듀이 κ°€μ§€κ³  μžˆλŠ” 블둝듀에 λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 높이가 μ •ν™•νžˆ H인 탑을 λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄ N=3, M=3, H=5일 λ•Œ, 각 ν•™μƒλ§ˆλ‹€ κ°€μ§€κ³  μžˆλŠ” λΈ”λ‘λ“€μ˜ 높이가 λ‹€μŒκ³Ό κ°™λ‹€κ³  κ°€μ •ν•˜μž.

  • 1번 학생: 2, 3, 5
  • 2번 학생: 3, 5
  • 3번 학생: 1, 2, 3

이 λ•Œ, νƒ‘μ˜ 높이가 μ •ν™•νžˆ 5κ°€ λ˜λ„λ‘ 블둝을 μŒ“λŠ” κ²½μš°λ‘œλŠ” λ‹€μŒμ˜ 6κ°€μ§€κ°€ μ‘΄μž¬ν•œλ‹€. (블둝을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” X둜 ν‘œμ‹œν•˜μ˜€λ‹€.)

 

μž…λ ₯


첫째 쀄에 μžμ—°μˆ˜ N, M, Hκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 50, 1 ≤ M ≤ 10, 1 ≤ H ≤ 1,000) λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 κ±Έμ³μ„œ 각 학생이 κ°€μ§„ λΈ”λ‘λ“€μ˜ 높이가 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€.

단, λͺ¨λ“  λΈ”λ‘μ˜ λ†’μ΄λŠ” 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©° ν•œ λͺ…μ˜ 학생이 κ°€μ§€κ³  μžˆλŠ” λͺ¨λ“  λΈ”λ‘λ“€μ˜ λ†’μ΄λŠ” μ„œλ‘œ λ‹€λ₯΄κ²Œ μ£Όμ–΄μ§„λ‹€.

 

좜λ ₯


첫째 쀄에 높이가 H인 탑을 λ§Œλ“œλŠ” 경우의 수λ₯Ό 10,007둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이


DPλ¬Έμ œμ΄λ‹€... (μ ν™”μ‹œ...γ„±.... 이...γ„Ή..γ…“γ„΄)

 

DP[i][j] λŠ” i λͺ…μ˜ 학생듀이 j λ†’μ΄μ˜ 탑을 μŒ“μ„ 수 μžˆλŠ” 경우의 수λ₯Ό μ˜λ―Έν•œλ‹€. 

μš°μ„  j = 0은 λͺ¨λ“  i 에 λŒ€ν•΄μ„œ 1이닀. 학생듀이 λͺ¨λ‘ 블둝을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 ‼️ λ”± ν•˜λ‚˜ ‼️

 

DP[i][j] λŠ” 두 κ°€μ§€ κ²½μš°κ°€ μžˆλ‹€.

  1. i 번째 학생이 μžμ‹ μ˜ k 번째 블둝을 μ‚¬μš©ν•˜λŠ” 경우
  2. i 번째 학생이 μžμ‹ μ˜ 블둝을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 

첫 번째 κ²½μš°λŠ” i - 1번 ν•™μƒκΉŒμ§€ j - block[i][k] λ†’μ΄μ˜ 탑을 μŒ“μ€ κ²½μš°μ΄λ‹€. 즉, DP[i - 1][j - studentsHas[k]]

두 번째 κ²½μš°λŠ” i - 1번 ν•™μƒκΉŒμ§€ j λ†’μ΄μ˜ 탑을 μŒ“μ€ κ²½μš°μ΄λ‹€. 즉, DP[i - 1][j]

μ½”λ“œ


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main_BOJ_18427_ν•¨κ»˜λΈ”λ‘μŒ“κΈ° {
    static final int mod = 10007;
    static int N, M, H;
    static int[][] DP;
    static List<Integer>[] studentsHas;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

        N = Integer.parseInt(stringTokenizer.nextToken());
        M = Integer.parseInt(stringTokenizer.nextToken());
        H = Integer.parseInt(stringTokenizer.nextToken());

        DP = new int[N+1][H+1];
        DP[0][0] = 1;
        studentsHas = new ArrayList[N+1];
        for(int i = 0 ; i < N+1 ; i++){
            studentsHas[i] = new ArrayList<>();
        }

        for(int i = 1 ; i <= N ;i++){
            stringTokenizer = new StringTokenizer(br.readLine());
            
            while(stringTokenizer.hasMoreTokens()){
                int block = Integer.parseInt(stringTokenizer.nextToken());
                studentsHas[i].add(block);
            }
        }

        for(int i = 1; i <= N ; i++){
            DP[i][0] = 1;
            for(int j = 1 ; j <= H ;j++){
                for(int k = 0 ; k < studentsHas[i].size() ; k++){
                    if(j - studentsHas[i].get(k) < 0)
                        continue;
                    
                    // i번째 학생이 ν•˜λ‚˜μ˜ 블둝 (k번째 블둝)을 μ„ νƒν•˜λŠ” 경우
                    DP[i][j] += DP[i-1][j-studentsHas[i].get(k)];
                }
                // i번째 학생이 블둝을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우
                DP[i][j] += DP[i-1][j];
                DP[i][j] %= mod;

            }
        }

        System.out.println(DP[N][H]);
    }
}
728x90
λ°˜μ‘ν˜•