Algorithm/백준
[백준][1463번] 1로 만들기
1일1코딩
2020. 3. 18. 22:49
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
풀이과정
1. dp를 이용했다.
2. -1, n/3, n/2 3가지 방식을 이용하면
dp[N] = min( n-1, n/3, n/2) + 1로 점화식을 구할 수 있다.
*마지막이 n - 1 인경우 + 1을 하면 dp[N]이 된다. 이와 같이 3가지 방식 중 가장 최솟값을 뽑아 내면 된다.
소스코드
더보기
#include <stdio.h>
#include <algorithm>
using namespace std;
int dp[1000001];
int solution(int n)
{
if (n <= 1) return 0;
if (dp[n] > 0) return dp[n];
dp[n] = solution(n - 1) + 1;
if (n % 3 == 0) {
int tmp = solution(n / 3) + 1;
dp[n] = min(dp[n], tmp);
}
if (n % 2 == 0) {
int tmp = solution(n / 2) + 1;
dp[n] = min(dp[n], tmp);
}
return dp[n];
}
int main()
{
int n;
scanf("%d", &n);
dp[1] = 0;
dp[2] = 1;
printf("%d\n", solution(n));
}