Algorithm/Beakjoon

[JAVA] 백준 2225번 : 합분해

mopipi 2024. 1. 22. 15:21
반응형

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

 

2225번: 합분해

첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net


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

public class Main {
    final static int mod = 1000000000;
    static int N, K;
    static int[][] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        dp = new int[K + 1][N + 1];
        for (int i = 1; i <= K; i++) {
            dp[i][0] = 1;
            for (int j = 1; j <= N; j++) {
                dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % mod;
            }
        }
        System.out.println(dp[K][N]);
    }
}

💡 DP

풀이

  •  백트래킹으로 하려 하니 역시 시간 초과 발생함 (당연한 시간 복잡도는 O(nlongn) 이니까...) 
    • 오르막수에서 배운거 안써먹고 뭐하는지?... 그냥 dp 쓰자..
  • 오르막수에서 dp 쓸 때는 각 idx를 마지막 수로 정해놓고 하나씩 밀어서 더했다 (오름차순이어야 하므로)
  • 하지만 이 문제는 오름차순일 필요 없음

EX) N = 6, K = 4=> dp[K][N] // dp[i][j] => i개의 수를 사용해서 합이 j가 되도록 만들 수 있는 경우의 수

  0 1 2 3 4 5 6
1 1 1 1 1 1 1 1
2 1 2 3 4 5 6 7
3 1 3 6 10 15 21 28
4 1 4 10 20 35 56 84
  • 각 행마다 row개 만큼 더해서 col 값이 되게하는 경우의 수 구함
    • dp[1][2] = 2 
    • dp[2][2] = (dp[1][2] + 0 경우) + (dp[1][1] + 1 경우) + (dp[1][0] + 2 경우) 가 됨
[📌점화식] dp[i][j] = dp[i][j-1] + dp[i-1][j] ( i >= 1 & j >= 1 )
   - dp[i][0] = 1 , dp[0][j] = 0

 

반응형