동적 프로그래밍 (동적 계획법, Dynamic Programming) "동적" (Dynamic) 이라는 단어는 순차적이고, 일시적인 방면의 문제를 푸는것이라는 것을 의미한다. 이는 복잡한 문제를 푸는 방법론이다. 큰 문제를 서브 문제들로 분해한다. 그리고 그 서브 문제들을 다 풀어내면, 큰 문제를 풀 수 있다. 동적 프로그래밍으로 풀 수 있는 문제들은 두가지 특성을 가지고있다. 최적의 세부구조를 가지고있다. 최적의 세부 구조들을 풀어내면, 그로 인해 원래의 문제가 풀리는 구조이다. 최적의 해를 찾기 위해 세부 문제들로 분해해야 한다. 겹치는 세부 문제들이 존재한다. 세부 문제들이 반복되어 일어난다. 또한 그 세부 문제들을 캐시(저장)하고 재사용한다. 따라서 그 세부 문제들을 반복해서 풀어내면 효율적으로 ..