Solved.ac Class3
public class Main {
private static int[] data;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br.readLine());
data = new int[x + 1];
data[0] = -1;
data[1] = -1;
System.out.println(solve(x));
}
private static int solve(int x) {
if (data[x] == 0) {
if (x % 6 == 0) {
int a = solve(x - 1);
int b = solve(x / 3);
int c = solve(x / 2);
data[x] = Math.min(a, Math.min(b, c));
} else if (x % 3 == 0) {
int a = solve(x - 1);
int b = solve(x / 3);
data[x] = Math.min(a, b);
} else if (x % 2 == 0) {
int a = solve(x - 1);
int b = solve(x / 2);
data[x] = Math.min(a, b);
} else {
data[x] = solve(x - 1);
}
}
return data[x] + 1;
}
}
시간초과
DP는 크게 3가지를 기억해야 한다고 한다.
1. 테이블 정의
2. 점화식 찾기
3. 초기값 정하기
테이블은 점화식을 위해 기본적으로 생성하는 배열이고
문제를 대입하면
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br.readLine());
int[] data = new int[x + 1];
data[0] = 0;
data[1] = 0;
for (int i = 2; i < x + 1; i++) {
data[i] = data[i - 1] + 1;
if (i % 2 == 0) {
data[i] = Math.min(data[i], data[i / 2] + 1);
}
if (i % 3 == 0) {
data[i] =Math.min(data[i], data[i / 3] + 1);
}
}
System.out.println(data[x]);
}
}
성공