동적 프로그래밍을위한 하위 문제 결정


39

나는 동적 프로그래밍 기술을 여러 번 사용했지만 오늘날 친구는 하위 문제를 정의하는 방법을 물었고 객관적인 공식 답변을 제공 할 방법이 없다는 것을 깨달았습니다. 동적 프로그래밍을 사용하여 해결할 문제에 대한 하위 문제를 공식적으로 정의하는 방법은 무엇입니까?


기존 답변 (2019 년 4 월 현재) 중 특히 초보자에게는 충분하지 않은 것처럼 보입니다. 다른 사이트에서 튜토리얼을 추천합니다.
Apass. Jack

답변:


35

동적 프로그래밍의 원칙은 하향식 (즉, 재귀 적으로) 생각하지만 상향식으로 해결하는 것입니다. 따라서 DP를 설계하는 좋은 전략은 문제를 재귀 적으로 공식화하고 하위 문제를 생성하는 것입니다.


14
나는 이것이 유일한 전략 이라고 주장한다 .
JeffE

2
@JeffE 네, 알고리즘 수업을 가르 칠 때 메모를 읽고 사용했는데 효과적이었습니다. 인용구 : "동적은 테이블을 채우는 것이 아니라 똑똑한 재귀에 관한 것입니다!"
Dai

2
DP를 가르치는 방법에 대한 나의 이해는 @JeffE의 노트에 크게 영향을받습니다. :)
Suresh

3
하향식 재귀 프로 시저를 동적 프로그래밍 알고리즘으로 자동으로 전환 할 수도 있습니다. 돌아올 때는 해시 테이블에 답을 저장하십시오. 각 호출이 시작될 때 응답이 이미 해시 테이블에 있는지 확인하고,있는 경우 즉시 리턴하십시오. 이 아이디어로 많은 알고리즘이 쉬워집니다. 예를 들어, 이러한 테이블에서 재귀 알고리즘은 자동으로 DAWG에서 작동합니다. 호출 시작시 테이블에 센티넬 값을 저장하면 DFA에서도 동일한 알고리즘을 사용할 수 있습니다. BDD의 알고리즘은 재귀 적으로 지정하기가 매우 쉬워집니다.
Jules

1
마지막으로, 이것은 큰 성능 이점을 가질 수 있습니다. 예를 들어, 전통적인 상향식 부분 집합 합계 알고리즘은 불필요한 테이블 항목을 계산할 수 있습니다. 이 방법을 사용하면 필요한 테이블 항목 만 계산됩니다.
Jules

4

@Suresh가 지적했듯이 DP가 문제를 해결할 수 있다는 것을 알게되면 (즉, 최적의 하위 구조와 겹치는 하위 문제가 있음) 분할 및 정복 재귀 솔루션을 생각할 수 있습니다.

물론, 분할 및 정복은 관련 재귀 트리에서 발생하는 모든 하위 문제가 이미 발견되어 해결 되었더라도 다시 해결되므로 매우 비효율적입니다. DP가 다른 곳입니다. 하위 문제가 발생할 때마다 문제를 해결하고 솔루션을 테이블에 저장합니다. 나중에 해당 하위 문제가 다시 발생하면 솔루션을 다시 해결하는 대신 시간에 솔루션에 액세스 합니다. 겹치는 하위 문제의 수는 일반적으로 다항식에 의해 제한되며 하나의 하위 문제를 해결하는 데 필요한 시간도 다항식이므로 (DP는 비용 효율적인 솔루션을 제공 할 수 없음) 일반적으로 다항식 솔루션을 얻습니다.O(1)

따라서 분할 및 정복 솔루션에 대해 생각하면 특정 문제에 대한 하위 문제가 무엇인지에 대한 통찰력을 얻을 수 있습니다.


1
"최적의 하부 구조"(그것이 무엇이든)는 아마도 DP- 해결을위한 충분한 조건이 아닐 것입니다. "중복 하위 문제"는 반드시 필요한 것은 아닙니다.
라파엘

1
DP에 의해 효율적으로 해결 될 수있는 문제들에 의해 최적의 하부 구조 및 중첩 된 문제들이 나타난다. 물론 최적의 하부 구조만으로는 DP 용해도에 충분하지 않습니다. 그러나 겹치는 하위 문제가없는 경우 일반 나누기로 문제를 해결하고 동일한 비용으로 정복 할 수 있습니다. 실제로, 정복 나누기보다 DP의 장점은 재귀 트리에서 발생할 때 각 하위 문제가 정확히 한 번만 해결된다는 것입니다. .
Massimo Cafaro

1
그것은 내 공식이 아닙니다. Cormen, Leiserson, Rivest 및 Stein의 "Introduction to algorithms"및 알고리즘에 대한 다른 많은 교과서에서 찾을 수 있습니다.
Massimo Cafaro

1
up, 그리고 대부분 부분적으로 잘못되었습니다. 적절한 질문을 게시하면 자세히 설명하겠습니다.
Raphael

1
마지막 의견을 제대로 이해하고 있는지 잘 모르겠습니다. 이러한 종류의 특성화가 잘못되었음을 보여주기 위해 (부분적으로 잘못 될 수는 없습니다 : 정확하거나 잘못되었습니다) 최적의 하위 구조와 겹치는 하위 문제를 모두 나타내지 않는 문제인 반례로 간단히 나타낼 수 있습니다. 다항식 DP 솔루션을 사용할 수 있습니다. 그러나 이러한 맥락에서 이는 일반적인 분할 및 정복보다 더 나은 솔루션을 의미합니다.
Massimo Cafaro

2

내 경험은 "이미 열거 된 유용한 가치를 저장하는 도움으로 중복 열거를 줄이는 방법"을 찾는 것입니다. 그런데 다이나믹 프로그래밍은 ICPC (International Collegiate Programming Contest)에서 정말 인기가 있습니다. ICPC 문제를 몇 번 연습하면 누구나 DP에 대한 느낌을 가질 수 있습니다.

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