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

모든 가능한 경로 중에서 연산 횟수가 가장 작은 경로를 찾는 최소 비용 탐색 문제다
각 연산의 비용(cost)은 모두 1이다.
모든 경로를 따라가다 가장 먼저 도착하는 길을 찾는것이 목표
재귀 호출을 통해 각 경우를 돌아 가장 횟수 적은걸 찾음
package src.dataStructure.DP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class P1463_DP_1 {
static Integer[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1]; // 숫자와 인덱스를 1:1로 대응시키기 위해서
dp[0] = dp[1] = 0;
System.out.print(recur(N));
}
private static int recur(int N) {
if (dp[N] == null) { // 1 이 될때까지
// 6으로 나눠지는 경우
if(N % 6 == 0){
dp[N] = Math.min(recur(N-1), Math.min(recur(N/3), recur(N/2))) + 1;
//Math.min 한번에 두개밖에 못해서 3개 씀
}
// 3으로만 나눠지는 경우
else if (N % 3 == 0){
dp[N] = Math.min(recur(N/3), recur(N-1))+1;
}
// 2로만 나눠지는 경우
else if (N % 2 == 0){
dp[N] = Math.min(recur(N/2), recur(N-1))+1;
}
// 2와 3으로 나눠지는 경우
else {
dp[N] = recur(N-1)+1;
}
}
return dp[N];
}
}
package src.dataStructure.DP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class P1463_DP_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
System.out.println(recur(N,0));
}
private static int recur(int N, int count) {
// N이 2 미만인 경우 누적된 count값을 반환
if(N<2){
return count;
}
return Math.min(recur(N/2,count+1+(N % 2)),recur(N/3,count+1+(N % 3)));
}
}