https://www.acmicpc.net/problem/2225
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
'Algorithm > Beakjoon' 카테고리의 다른 글
[JAVA] 백준 9184번 : 신나는 함수 실행 (1) | 2024.01.24 |
---|---|
[JAVA] 백준 1309번 : 동물원 (0) | 2024.01.23 |
[JAVA] 백준 11660번 : 구간 합 구하기 5 (0) | 2024.01.19 |
[JAVA] 백준 9465번 : 스티커 (0) | 2024.01.18 |
[JAVA] 백준 15686번 : 치킨 배달 (0) | 2024.01.17 |