정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
전형적인 DP
#include <stdio.h>
#include <stdlib.h>
#define MIN(a, b) a < b ? a : b
int main(void) {
int n;
int *arr;
scanf("%d", &n);
arr = (int*)malloc(sizeof(int) * (n + 1));
arr[0] = arr[1] = 0;
arr[2] = arr[3] = 1;
for (int i = 4; i < n + 1; i++) {
if (i % 2 == 0 && i % 3 == 0)
arr[i] = (MIN(MIN(arr[i / 2], arr[i / 3]), arr[i - 1])) + 1;
else if (i % 2 == 0)
arr[i] = (MIN(arr[i / 2], arr[i - 1])) + 1;
else if (i % 3 == 0)
arr[i] = (MIN(arr[i / 3], arr[i - 1])) + 1;
else
arr[i] = arr[i - 1] + 1;
}
printf("%d\n", arr[n]);
free(arr);
return 0;
}