Search
moon
sun

20210118(월)

내용
BOJ) 1463
공부장소
열
2021/03/20 18:22

백준 알고리즘 1463

이번 문제는 DP(Dynamic Programing)문제였다. 이전에 DP에 대한 이해를 하고 문제를 푼 적이 없어서 문제를 풀기 전에 간단하게 DP에 대해 알아보았다. 출처는 아래의 Blog이다.
•
Dynamic Programming(이하 DP)은 우리말로 동적 프로그래밍(DP)이라고 한다.
•
RL에서는 기본적으로 확률 동적 프로그래밍 (Probabilistic Dynamic Programming) 기법을 사용하게 된다.
◦
즉, 기본적인 DP 모델에 확률 이론이 포함된다는 이야기이다.
•
따라서 여기서는 먼저 간단하게 동적 프로그래밍(DP)이 뭔지 확인해보고 넘어가도록 하자.
◦
물론 동적 프로그래밍을 이해하기 위해서는 먼저 결정적 프로그래밍(deterministic programming) 방식을 무엇인지 이해하고 있어야 한다.
▪
여기서는 이런것까지 언급할 시간이 없다. 바로 동적 프로그래밍이 뭔지만 보고 넘어가도록 하자.
▪
물론 학교 다닐때 다 배운 내용이기도 하다. (예를 들어 BFS , DFS 등이 대표적인(가장 쉬운) 결정적 프로그래밍 기법.)
▪
최단거리 같은거 많이 구해보았을 것이다.

동적 프로그래밍의 기초

•
최적화 기법 중 하나로 재귀(recursion)를 이용하여 최적화 솔루션을 얻어내는 방식을 사용한다.
•
동적 프로그래밍으로 풀 수 있는 가장 유명한 문제로 배낭 문제(Knapsack problem)를 들 수 있다.
•
이것만 살펴보면 DP를 쉽게 이해할 수 있다.
이제 DP에 대한 개념을 어느정도 알아 보았으니 관련된 문제를 풀어보았다.
#include <iostream> #include <vector> std::vector<int> dp_vector; int X; int result; void output() { std::cout << result; } void solution() { dp_vector[1] = 0; for (int i = 2 ; i <= X ; i++) { dp_vector[i] = dp_vector[i - 1] + 1; if (i % 2 == 0) dp_vector[i] = std::min(dp_vector[i],dp_vector[i / 2] + 1); if (i % 3 == 0) dp_vector[i] = std::min(dp_vector[i],dp_vector[i / 3] + 1); } result = dp_vector[X]; } void input() { std::cin >> X; dp_vector.resize(X + 1); } void preset() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); } int main() { preset(); input(); solution(); output(); }
C++
복사