개발/알고리즘

백준 1463 번 : 1로 만들기

라사 RASA 2020. 9. 4. 19:32

문제 접근


count 가 최소가 되도록 DP 로 구현했다. return  할 때, 1 + ( 세 가지 연산의 각 경우 중 최솟값 ) 을 반환하기에 cache[n] 에는 숫자 n 이 1 로 되는 최소 연산 횟수가 저장되어있고, 이를 통해 중복을 빠르게 처리하여 답을 구할 수 있다.

 

 

문제 코드


#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int cache[1000001];

int count(int n)
{
	int& ret = cache[n];
	
	if(ret != -1)
		return ret;
	if(n == 1)
		return ret=0;
	
	int d3,d2,m1;
	d3=d2=m1=1000001;
	
	if(n % 3 == 0 && n > 2)
		d3 = count(n/3);
	
	if(n % 2 == 0 && n > 1)
		d2 = count(n/2);
	
	m1 = count(n-1);
	
	return ret = 1 + min(m1,min(d2,d3));
}

int main(void)
{
	int x;
	memset(cache, -1, sizeof(cache));
	scanf("%d",&x);
	printf("%d\n",count(x));
	return 0;
}