DP는 중복 계산을 줄여 성능을 높이는 알고리즘 설계 기법이다.
알고리즘 설계 기법 : 문제를 해결하는 전략
알고리즘 기법 : 그 전략을 구현한 실제 방법
복잡한 문제를 작은 하위 문제로 나누고, 그 결과를 저장해 두었다가 재활용하는 기법.
✔ 최적화 문제나 중복 계산이 많은 문제에서 유용하게 쓰인다
큰 문제를 작은 부분 문제로 나누어 해결하는 방식이다. 보통 재귀 함수를 사용하여 큰 문제를 작은 부분으로 쪼개어 권한을 위임하고, 중복을 피하기 위해 memoization 기법을 활용하여 계산된 값을 저장해놓는다.
but! 재귀 호출의 overhead가 발생할 수 있어 시간초과가 발생할 수도 있다.
❓ 언제 사용?
🎐 예시
LCS (최장 공통 부분 수열)
DP + DFS 문제 (ex. 이동 경로 카운팅)
상태 공간이 너무 크지만 실제로 도달하는 경우가 적을 때
말 그대로 작은 부분 문제부터 해결하여 전체 문제까지 차례대로 올라오며 해결하는 기법이다. 반복문을 사용하여 작은 부분 문제부터 차례로 해결하며 해결한 값을 배열 등에 저장하여 사용한다.
❓ 언제 사용?
🎐 예시
1로 만들기 (백준 1463)
피보나치 수 (큰 N)
배낭 문제
계단 오르기, 동전 교환
실제로 백준 1463번 : 1로 만들기 문제에서도 먼저 top-down으로 풀었다가 시간초과가 나서 bottom-up으로 다시 풀었다^^..
https://velog.io/@seha01130/백준JAVA-1463번-1로-만들기