dynamic programming
동적 계획법
- 분할 정복과 같은 접근방식을 의미
- 차이는 문제를 나누는 방식
- 동적계획법에서 어떤 부분 문제는 두 개 이상의 문제를 푸는 데 사용될 수 있기 대문에, 이 문제의 답을 여러 번 계산하는 대신 한 번만 계산하고 재활용하면서 속도 향상 -> 문제의 답을 메모리에 저장, 캐싱
- 함수의 결과를 저장하는 장소를 마련해두고 재활용하는 최적화 기법 = 메모이제이션
- 입력이 같으면 출력이 항상 같은 함수에만 메모이제이션을 적용할 수 있다
- 참조적 투명함수의 경우에만 메모이제이션이 적용 가능
- 기저사례 먼저 체크
- 캐시 값을 -1로 초기화(양수일 때만 가능)
시간복잡도 : 존재하는 부분 문제의 수 * 한 부분 문제를 풀 때 필요한 반복문 수행 횟수
푸는법
- 완전탐색을 이용해 해결한다
- 중복된 부분 문제를 한 번만 계산하도록 메모이제이션을 적용
와일드 카드
시간복잡도 : n 제곱 * 1 = n제곱
최적화 문제
최적 부분 구조 어떤 문제와 분할방식에 성립하는 조건 각 부분 문제의 최적해만 있으면 전체 문제의 최적해를 쉽게 얻어낼 수 있을 경우 이 조건이 성립
최적화 문제 동적 계획법 레시피
- 완전 탐색 알고리즘 설계
- 전체 답의 점수 반환이 아닌, 앞으로 남은 선택들에 해당하는 점수만을 반환하도록 부분 문제 정의 수정
- 재귀 호출의 입력 이전의 선택과 관련된 정보가 있다면 필요한 것만 남기고 줄인다. 최적 부분 구조 성립 시 이전 선택 정보를 완전히 없앨 수도 있다. 우리이 목표는 가능한 한 중복되는 부분 문제를 많이 만드는 것이다. 입력의 종류가 줄수록 부분 문제의 중복이 많아지고, 메모이제이션을 최대한 활용 가능하다.
- 입력이 배열이나 문자열인 경우 적절한 변환을 통해 메모이제이션
- 메모이제이션 적용
Written on 2016 Apr, 22