최근 동적 프로그래밍에 대해 읽었습니다. 처음부터 시작하여 DP 문제를 식별하고 해결하는 데 능숙한 사람의 의견을 듣고 싶습니다. DP로 이러한 문제를 식별하고 간결한 솔루션을 만드는 데 어려움을 겪고 있습니다.
나는 초보자 DP 문제와 MIT 자원의 대부분을 겪었습니다.
최근 동적 프로그래밍에 대해 읽었습니다. 처음부터 시작하여 DP 문제를 식별하고 해결하는 데 능숙한 사람의 의견을 듣고 싶습니다. DP로 이러한 문제를 식별하고 간결한 솔루션을 만드는 데 어려움을 겪고 있습니다.
나는 초보자 DP 문제와 MIT 자원의 대부분을 겪었습니다.
답변:
나는 물리학 배경과 많은 수학에서 나왔습니다. 유도에 의한 증명으로 유사점을 찾아 재귀 / 동적 프로그래밍 솔루션에 적합한 문제를 쉽게 발견 할 수 있습니다 .
귀납으로 증명하면 두 부분으로 구성됩니다.
재귀 프로그래밍 / 동적 프로그래밍에서 :
따라서 다른 사람들이 대답했듯이 경험과 힌트를 선택하는 문제이지만 다른 기술을 재사용하여 안내 할 수 있습니다. 그 후에는 항상 언급 한 두 부분을 가져야합니다. 그렇지 않으면 작동하지 않습니다.
예를 들어 집합의 모든 순열을 생성하려면
대부분의 동적 프로그래밍 문제는 메모를 통해 해결할 수 있습니다. 메모 화는 일반적으로보다 직관적이고 코딩하기 쉽습니다. DP 대신 메모로 생각하는 것이 도움이 될 수 있습니다.
문제가 메모 화에 적합한 지 여부를 쉽게 알 수 있습니다 (단계는 Slivvz의 답변 과 동일 하지만 정신적 전환이 조금 짧습니다). 그러나 메모를 통해 문제를 해결 한 후에는 메모 캐시가 채워지는 방법을 검토 한 다음 재귀없이 순서대로 채울 수 있습니다. 이는 알고리즘을 동적 프로그래밍 알고리즘으로 변경합니다.
TL; DR; 버전 : 메모의 관점에서 동적 프로그래밍을 이해하기가 더 쉬울 수 있습니다.
참조 에 StackOverflow : 하향식 (top-down)이 접근 상향식 (bottom-up) 대 : 동적 프로그래밍 및 메모이 제이션 .
동적 프로그래밍은 정의 적으로 두 가지에 관한 것입니다.
최적의 하부 구조
더 큰 솔루션은 더 작은 솔루션에서 파생 될 수 있습니다. 해결은 양방향이 아닙니다.
겹치는 하위 문제
작은 솔루션은 여러 번 재사용됩니다. 하위 문제가 전혀 겹치지 않으면 DP / 메모리를 사용하지 않아도됩니다. 당신이 가진 것은 대신 나누고 정복하는 것입니다.
DP 문제에 대한 일반적인 접근 방식은 다음과 같습니다.
작동하는 순진 재귀 또는 반복 버전을 작성하십시오.
기능이 중복 작업을 수행하고 있음에 유의하십시오.
종종 메모를 통해 중복 작업을 피하는 방법을 찾으십시오.
나는 몇 년 전 Project Euler 문제를 시작했을 때까지 단일 동적 프로그래밍 솔버를 구현하지 않았습니다 . DP 해결 가능한 문제들 (예 : 76 , 158 , 161 , 242), 그러나 더 많은 것들이 있습니다) 거의 내가 가장 좋아하는 종류로 밝혀졌습니다. 유용한 기술이 될 때 더 잘 알아볼 수 있습니다. 기본적으로 필요한 경로의 폭발을 길들이는 것이 가능한 일종의 재귀, 분할 및 정복 접근법으로 해결할 수있는 것처럼 보이는 것을 찾으십시오. 반복되는 하위 문제를 인식하고 이전에 계산 된 결과를 재사용하여 탐색해야합니다. 메모 할 최소 상태 벡터를 식별 할 수 있고 관련이없는 "이력"을 지울 수있는 것은 중요한 단계입니다.