동적 계획법 예제 - 1
Last updated
Last updated
N(구하려고 하는 수)
dp(연산 횟수 최솟값을 저장하는 dp 테이블)
dp[1] = 0 # 1이 1이 될 때까지 연산이 불필요하므로 0으로 초기화 가능
for i 2~N:
dp[i] = dp[i - 1] + 1
if 2의 배수:
dp[i / 2] + 1이 dp[i] 보다 작으면 변경
if 3의 배수:
dp[i / 3] + 1이 dp[i] 보다 작으면 변경
dp[N] 출력import sys
input = sys.stdin.readline
N = int(input())
dp = [0] * (N + 1)
dp[1] = 0 # 굳이 초기화할 필요는 없지만 명시적으로 표시
for i in range(2, N + 1):
dp[i] = dp[i - 1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
print(dp[N])import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] dp = new int[N + 1];
dp[1] = 0;
for (int i = 2; i <= N; i++) {
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0) {
dp[i] = Math.min(dp[i], dp[i / 2] + 1);
}
if (i % 3 == 0) {
dp[i] = Math.min(dp[i], dp[i / 3] + 1);
}
}
System.out.println(dp[N]);
}
}