

주어진 재귀함수를 실제로 구현하는 문제다.
동적프로그래밍을 활용할 경우, 값을 저장할 배열(DP 라고 하겠다)의 사이즈를 고민해볼 필요가 있다.
문제의 제한 사항에서 a, b, c의 범위가 주어졌지만, 주어진 재귀함수의 첫 번째와 두 번째 조건
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)
에 의해 DP의 사이즈는 [21][21][21] 로 선언할 수 있다.
import java.util.Scanner;
public class Main {
static int[][][] dp = new int[21][21][21];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
while (true) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
if (a == -1 && b == -1 && c == -1) {
break;
}
System.out.println("w("+a+", "+b+", "+c+") = "+w(a, b, c));
}
}
static int w(int a, int b, int c) {
if (inRange(a, b, c) && dp[a][b][c] != 0) {
return dp[a][b][c];
}
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if (a > 20 || b > 20 || c > 20) {
return dp[20][20][20] = w(20, 20, 20);
}
if (a < b && b < c) {
return dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
}
return dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
}
static boolean inRange(int a, int b, int c) {
return 0 <= a && a <= 20 && 0 <= b && b <= 20 && 0 <= c && c <= 20;
}
}
'Algorithm' 카테고리의 다른 글
백준 1149번 RGB거리 (0) | 2023.03.16 |
---|---|
백준 9461번 파도반수열 (0) | 2023.03.16 |
백준 11053번 가장 긴 증가하는 부분 수열 (0) | 2023.03.15 |
백준 2579번 계단 오르기 (0) | 2023.03.14 |
백준 1003번 피보나치 함수 (1) | 2023.03.14 |
댓글