알고리즘 풀이/DP(동적계획법)
BOJ 1463 [1로 만들기]
갓우태
2018. 9. 25. 21:31
BOJ 1로 만들기 : https://www.acmicpc.net/problem/1463
안녕하세요. 이번 문제는 백준 온라인 저지의 "1로 만들기" 입니다.
우선, 정수 1에서 1로 가기위해 사용되는 연산 수는 0입니다. (arr[1] = 0)
그 다음, 2, 3에서 1로 가기위해 사용되는 연산 수는 1입니다. (2 / 2 or 2 - 1 = 1, 3 / 3 = 1 -> arr[2], arr[3] = 1)
4부턴 1로 가는 방법이 여러가지입니다. (4 / 2 = 2 / 2 = 1, 4 - 1 = 3 / 3 = 1 -> arr[4] = 2)
이제부터 N에 대해 보겠습니다. 총 세 가지 값을 비교하면 됩니다.
만약 N을 3으로 나눌 수 있으면, arr[N] = arr[N / 3] + 1이 됩니다.
또, 2로 나눌 수 있으면 arr[N / 2] + 1이 됩니다.
마지막으로 arr[N - 1] + 1이 있습니다.
이 세 값을 비교해, 가장 작은 값이 arr[N]이 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <iostream> using namespace std; int main() { int N; cin >> N; int* arr= new int[N+1]; arr[1] = 0; if(N == 2) { arr[2] = 1; } else if(N > 2){ arr[2] = 1; arr[3] = 1; } for(int i=4; i<=N; i++) { int temp = 999999; if(i % 3 == 0) { if(temp > arr[i/3] + 1) temp = arr[i/3] + 1; } if(i % 2 == 0) { if(temp > arr[i/2] + 1) temp = arr[i/2] + 1; } if(temp > arr[i-1] + 1) temp = arr[i-1]+1; arr[i] = temp; } cout << arr[N]; return 0; } | cs |
반응형