백준

[백준 1463] 1로 만들기 C++

케굴 2021. 10. 9. 23:15

다이나믹 프로그래밍 문제이다. 

실버 문제라서 그런지 식이 바로 떠올라서 바로 풀었다.

가장 i =1 부터 i+1 , i *2 , i*3 을 하나씩 계산해 주면 된다.

 

사실 3번 틀렸는데 이유가 dp[1] = 1이 아니라 dp[1] =0 이다.

dp[1] =1이라고 하면 100% 까지 가서 틀렸습니다가 뜬다.  

#include <bits/stdc++.h> 
#define FASTIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 987654321
typedef long long ll;
using namespace std;
int num;
int cnt=0;
int dp[1000005];
int main() {
	cin >> num;
	for (int i = 1; i <= num; i++) {
		dp[i] = INF;
	}
	dp[1] = 0;
	dp[2] = 1;
	dp[3] = 1;
	
	for (int i = 1; i <= num; i++) {
		if (i + 1 <= num)
			dp[i + 1] = min(dp[i]+1, dp[i + 1]);
		if (i * 2 <= num)
			dp[i * 2] = min(dp[i] + 1, dp[i * 2]);
		if(i*3 <= num)
			dp[i * 3] = min(dp[i] + 1, dp[i * 3]);
	}

	cout << dp[num];
}

dp 문제는 코딩은 참 쉬운데 구상이 어려운것 같다

근데 이문제는 구상도 쉬웠다 

덕분에 오늘 아주 쉽게 경험치 획득~