Algorithm

[백준] 1로 만들기 1463번 (c++)

salmon16 2021. 4. 2. 15:02

출처 : 1463번: 1로 만들기 (acmicpc.net) 

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

해결 방법

dp문제 이다. top-down으로 해결 하였다.

3으로 나누어 지면 f(n/3)을 호출해서 저장하고

2로 나누어 지면 f(n/2)을 호출해서 저장하고

f(n-1)을 호출해서 저장해 가장 작은 값에다가 +1을 더해 주어서 리턴하였다.

#include <iostream>
#include <memory.h>
#include <algorithm>

using namespace std;
int dp[100001];
const int INF = 987654321;

int f(int n) {
	if (n == 1) return 0;
	int& ret = dp[n];
	int tree = INF, two =INF, one = INF;
	if (n % 3 == 0) {
		tree = f(n / 3);
	}
	if (n % 2 == 0) {
		two = f(n / 2);
	}
	one = f(n - 1);
	ret = min(tree,min(two, one)) + 1;
}

int main() {
	memset(dp, -1, sizeof(dp));
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

 

'Algorithm' 카테고리의 다른 글

[백준] RGB거리 1149번 (c++)  (0) 2021.04.06
[백준] 1,2,3 더하기 9095번 (c++)  (0) 2021.04.02
[algospot] Quantization (c++)  (0) 2021.04.02
[백준] 설탕 2839번 (c++)  (0) 2021.04.02
[algospot] 폴리오미노 (c++)  (0) 2021.04.01