나는 한동안 동적 인 프로그래밍 작업을 해왔다. 동적 프로그래밍 재귀를 평가하는 정식 방법은 필요한 모든 값의 테이블을 만들고 행 단위로 채우는 것입니다. 예를 들어 Cormen, Leiserson et al : "Introduction to Algorithms" 를 참조하십시오 .
필자는 2 차원 (행 단위로 채움)으로 테이블 기반 계산 체계에 중점을두고 셀 종속성의 구조, 즉 다른 셀을 계산하기 전에 어떤 셀을 수행해야하는지 조사합니다. 셀 의존 하는 셀의 인덱스 세트 를 합니다 . 참고 사이클이 없어야합니다.I Γ
나는 계산되는 실제 함수에서 추상화하고 재귀 구조에 집중합니다. 공식적으로, 재귀 가 형식이있는 경우 동적 프로그래밍 이라고 생각합니다.
로 , 및 사용하지 않고 일부 (계산 가능) 함수 비아 이외 .~ Γ d ( i ) = { ( j , d ( j ) ) ∣ j ∈ Γ d ( i ) } f d ∼ Γ d
의 입도 를 거친 영역 (현재 셀의 왼쪽, 왼쪽 위, 위쪽, 오른쪽 위 등)으로 제한 할 때 유효한 세 가지 경우 (대칭 및 회전까지)가 관찰됩니다. 테이블을 채울 수있는 방법을 알려주는 동적 프로그래밍 재귀 :
빨간색 영역은 나타냅니다 . 사례 1과 2는 부분 집합을 인정하고 사례 3은 최악의 경우입니다 (인덱스 변환까지). 전체 빨간색 영역이 로 덮여 있어야하는 것은 아닙니다 . 테이블의 모든 빨간색 부분에있는 일부 셀은 빨간색으로 페인트하기에 충분합니다. 흰색 영역 에는 필요한 셀이 포함 되어 있지 않아야 합니다.
사례 1의 예는 편집 거리 와 가장 긴 공통 서브 시퀀스 이며, 사례 2는 Bellman & Ford 및 CYK에 적용됩니다 . 덜 명백한 예로는 제안 된 사례에 맞게 회전 할 수 있기 때문에 행 (또는 열)이 아닌 대각선에서 작동하는 것입니다. 예를 들어 Joe의 답변 을 참조하십시오 .
그래도 사례 3에 대한 (자연적인) 예는 없습니다! 그래서 내 질문은 : 세 가지 동적 프로그래밍 재귀 / 문제의 예는 무엇입니까?