동적 프로그래밍에 적합한 문제를 어떻게 식별합니까?


19

최근 동적 프로그래밍에 대해 읽었습니다. 처음부터 시작하여 DP 문제를 식별하고 해결하는 데 능숙한 사람의 의견을 듣고 싶습니다. DP로 이러한 문제를 식별하고 간결한 솔루션을 만드는 데 어려움을 겪고 있습니다.

나는 초보자 DP 문제와 MIT 자원의 대부분을 겪었습니다.

답변:


17

나는 물리학 배경과 많은 수학에서 나왔습니다. 유도에 의한 증명으로 유사점을 찾아 재귀 / 동적 프로그래밍 솔루션에 적합한 문제를 쉽게 발견 할 수 있습니다 .

귀납으로 증명하면 두 부분으로 구성됩니다.

  • N 반복에 대해 어떤 것이 진실이라면 N + 1에 대해서도 참임을 증명합니다
  • 당신은 그것이 반복 사실임을 증명 1

재귀 프로그래밍 / 동적 프로그래밍에서 :

  • 종료 조건을 식별합니다 (예 : 반복을 위해 솔루션을 하드 와이어로 연결)
  • 반복 N-1에 대한 솔루션이 주어지면 반복 N에 대한 솔루션을 계산합니다.

따라서 다른 사람들이 대답했듯이 경험과 힌트를 선택하는 문제이지만 다른 기술을 재사용하여 안내 할 수 있습니다. 그 후에는 항상 언급 한 두 부분을 가져야합니다. 그렇지 않으면 작동하지 않습니다.

예를 들어 집합의 모든 순열을 생성하려면

  • 종료 조건 : 하나의 요소 만있는 경우 반환
  • 재귀 : N 항목 집합의 순열은 각 요소를 선택하고 요소를 제거하여 얻은 하위 집합의 모든 N-1 (다수) 순열과 조합하여 얻은 N 순열 집합입니다.

8

대부분의 동적 프로그래밍 문제는 메모를 통해 해결할 수 있습니다. 메모 화는 일반적으로보다 직관적이고 코딩하기 쉽습니다. DP 대신 메모로 생각하는 것이 도움이 될 수 있습니다.

문제가 메모 화에 적합한 지 여부를 쉽게 알 수 있습니다 (단계는 Slivvz의 답변 과 동일 하지만 정신적 전환이 조금 짧습니다). 그러나 메모를 통해 문제를 해결 한 후에는 메모 캐시가 채워지는 방법을 검토 한 다음 재귀없이 순서대로 채울 수 있습니다. 이는 알고리즘을 동적 프로그래밍 알고리즘으로 변경합니다.

TL; DR; 버전 : 메모의 관점에서 동적 프로그래밍을 이해하기가 더 쉬울 수 있습니다.

참조 에 StackOverflow : 하향식 (top-down)이 접근 상향식 (bottom-up) 대 : 동적 프로그래밍 및 메모이 제이션 .


4

동적 프로그래밍은 정의 적으로 두 가지에 관한 것입니다.

  1. 최적의 하부 구조
    더 큰 솔루션은 더 작은 솔루션에서 파생 될 수 있습니다. 해결은 양방향이 아닙니다.

  2. 겹치는 하위 문제
    작은 솔루션은 여러 번 재사용됩니다. 하위 문제가 전혀 겹치지 않으면 DP / 메모리를 사용하지 않아도됩니다. 당신이 가진 것은 대신 나누고 정복하는 것입니다.

DP 문제에 대한 일반적인 접근 방식은 다음과 같습니다.

  • 작동하는 순진 재귀 또는 반복 버전을 작성하십시오.

  • 기능이 중복 작업을 수행하고 있음에 유의하십시오.

  • 종종 메모를 통해 중복 작업을 피하는 방법을 찾으십시오.


이것들은 모두 이론적 인 관점에서 사실입니다. IMO 빠른 식별에 익숙해 지려면 조금 더 연습이 필요합니다. :)
user110036

2

나는 몇 년 전 Project Euler 문제를 시작했을 때까지 단일 동적 프로그래밍 솔버를 구현하지 않았습니다 . DP 해결 가능한 문제들 (예 : 76 , 158 , 161 , 242), 그러나 더 많은 것들이 있습니다) 거의 내가 가장 좋아하는 종류로 밝혀졌습니다. 유용한 기술이 될 때 더 잘 알아볼 수 있습니다. 기본적으로 필요한 경로의 폭발을 길들이는 것이 가능한 일종의 재귀, 분할 및 정복 접근법으로 해결할 수있는 것처럼 보이는 것을 찾으십시오. 반복되는 하위 문제를 인식하고 이전에 계산 된 결과를 재사용하여 탐색해야합니다. 메모 할 최소 상태 벡터를 식별 할 수 있고 관련이없는 "이력"을 지울 수있는 것은 중요한 단계입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.