Study hard

(c++)백준 1463번: 1로 만들기 본문

백준/DP

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

Nimgnoej 2020. 6. 8. 13:17

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

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

www.acmicpc.net

점화식 

dp[i]:정수 i를 1로 만들기 위해 연산을 사용하는 최소 횟수

 

dp[x] = min(1+dp[x-1], 1+dp[x/2])  if(x%2==0)

dp[x] = min(1+dp[x-1], 1+dp[x/3])  if(x%3==0)

dp[x] = 1+dp[x-1]  if(x%2!=0 && x%3!=0)

 

#include <iostream>
#include <algorithm>//min
using namespace std;

int N;
int dp[1000001];//최소 연산 사용 횟수 저장

void DP() {
	//초기값 설정
	dp[1] = 0;
	dp[2] = 1;
	dp[3] = 1;
	for (int i = 4; i <= N; i++) {
		//3으로 나누어 떨어질 때
		if (i % 3 == 0) {
			dp[i] = min(1 + dp[i - 1], 1 + dp[i / 3]);
		}
		//2로 나누어 떨어질 때
		else if (i % 2 == 0) {
			dp[i] = min(1 + dp[i - 1], 1 + dp[i / 2]);
		}
		//2,3으로 나누어 떨어지지 않을 때
		else {
			dp[i] = 1 + dp[i - 1];
		}
	}
	cout << dp[N] << endl;
}

int main() {
	cin >> N;
	DP();
	return 0;
}

'백준 > DP' 카테고리의 다른 글

(c++)백준 11057번: 오르막 수  (0) 2020.06.08
(c++)백준 10844번: 쉬운 계단 수  (0) 2020.06.08
(c++)백준 9095번: 1, 2, 3 더하기  (0) 2020.06.08
(c++)백준 11727번: 2xn 타일링 2  (0) 2020.06.08
(c++)백준 11726번: 2xn 타일링  (0) 2020.06.08