-
백준 2225번 합분해 [DP] :: 마이구미알고리즘 풀이/동적계획법 2017. 3. 9. 20:11반응형
이번 글은 백준 알고리즘 문제 2225번 "합분해" 를 다뤄본다.
동적계획법으로 접근하는 문제이다.
일단 문제를 보자.
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.
덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
문제는 간단하다.
하지만 점화식을 생각하기에는 어렵다.
간단하게 먼저 2차원 배열로 생각해보자.
DP[K][N] = K개를 더해서 합이 N일 경우를 생각할 수 있다.
이어서 그림을 통해 알아보자.
그림을 설명해보자면, 합 N을 만들기 위해서는 0~N까지 정수가 다양하게 존재한다.
그 중 마지막 수를 L라고 가정하자.
L 이전의 수들의 합은 N-L 이라는 것을 알 수 있다.
또한 K개에서 L인 수를 제외하기 때문에 수의 개수는 K-1이 된다.
이를 활용해서 점화식을 만들 수 있다.
DP[K][N] = Σ(DP[K-1][N-L])
L => 0 <= L <= N
위 점화식을 이제 코드로 구현하면 끝이다.
코드 또한 어렵지 않게 구현이 가능하다.
for(int i=0;i<=n;i++) { dp[1][i] = 1; } for(int i=1;i<=k;i++) { for(int j=0;j<=n;j++) { for(int l=0;l<=j;l++) { dp[i][j] += dp[i-1][j-l]; } } }
k가 1일 경우 각 0~N은 경우의 수가 1이기 때문에 1로 초기화 시켜준다.
그 후 점화식을 활용하여 3중 반복문을 활용하면 된다.
전체 소스는 아래 Github URL을 참고하면 된다.
백준 알고리즘 2225번 합분해 전체 소스
https://github.com/hotehrud/acmicpc/blob/master/algorithm/dp/2225.java
반응형'알고리즘 풀이 > 동적계획법' 카테고리의 다른 글
백준 2240번 자두나무 [DP] :: 마이구미 (0) 2017.03.27 백준 2011번 암호코드 [DP] :: 마이구미 (2) 2017.03.19 백준 10164번 격자상의 경로 [DP] :: 마이구미 (0) 2017.03.05 백준 2302번 극장 좌석 [DP] :: 마이구미 (0) 2017.02.25 백준 1309번 동물원 [DP] :: 마이구미 (2) 2017.02.17