답변:
동적 프로그래밍의 원칙은 하향식 (즉, 재귀 적으로) 생각하지만 상향식으로 해결하는 것입니다. 따라서 DP를 설계하는 좋은 전략은 문제를 재귀 적으로 공식화하고 하위 문제를 생성하는 것입니다.
@Suresh가 지적했듯이 DP가 문제를 해결할 수 있다는 것을 알게되면 (즉, 최적의 하위 구조와 겹치는 하위 문제가 있음) 분할 및 정복 재귀 솔루션을 생각할 수 있습니다.
물론, 분할 및 정복은 관련 재귀 트리에서 발생하는 모든 하위 문제가 이미 발견되어 해결 되었더라도 다시 해결되므로 매우 비효율적입니다. DP가 다른 곳입니다. 하위 문제가 발생할 때마다 문제를 해결하고 솔루션을 테이블에 저장합니다. 나중에 해당 하위 문제가 다시 발생하면 솔루션을 다시 해결하는 대신 시간에 솔루션에 액세스 합니다. 겹치는 하위 문제의 수는 일반적으로 다항식에 의해 제한되며 하나의 하위 문제를 해결하는 데 필요한 시간도 다항식이므로 (DP는 비용 효율적인 솔루션을 제공 할 수 없음) 일반적으로 다항식 솔루션을 얻습니다.
따라서 분할 및 정복 솔루션에 대해 생각하면 특정 문제에 대한 하위 문제가 무엇인지에 대한 통찰력을 얻을 수 있습니다.