문제 링크
https://www.acmicpc.net/problem/9184
문제 해설
메모이제이션(memoization) 만으로 풀 수 있는 문제.
이미 구해놓은 값을 배열에 저장해 놓고, 만약 저장되어 있는 값을 불러오는 경우라면 빼서 쓰도록 하면 된다.
답안
import java.util.Scanner;
public class Main {
static int[][][] dp_arr = new int[21][21][21];
public static int w(int a, int b, int c) {
//BC
if(a<=0 || b<=0 || c<=0) {
return 1;
}
if(a>20 || b>20 || c>20) {
return w(20, 20, 20);
}
//Memoization
if(dp_arr[a][b][c] != 0) {
return dp_arr[a][b][c];
}
//Condition1
if(a<b && b<c) {
dp_arr[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
return dp_arr[a][b][c];
}
//Condition2(otherwize)
dp_arr[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);
return dp_arr[a][b][c];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = 0;
int b = 0;
int c = 0;
while(true) {
//Inputs
a = scanner.nextInt();
b = scanner.nextInt();
c = scanner.nextInt();
//Break condition
if(a==-1 && b==-1 && c==-1) {
break;
}
//Outputs
System.out.printf("w(%d, %d, %d) = %d\n", a, b, c, w(a, b, c));
}
scanner.close();
}
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준 2628 Python] 종이자르기 (0) | 2021.08.01 |
---|---|
[백준 1244 Python] 스위치 켜고 끄기 (0) | 2021.07.25 |
[백준 2669 Python] 직사각형 네개의 합집합의 면적 구하기 (0) | 2021.07.25 |
[백준 2635 Python] 수 이어가기 (0) | 2021.07.25 |
[백준 1904 JAVA] 01타일 (0) | 2021.03.27 |