동적 계획법 예제 - 10
문제 분석
주어진 내용에 충실하게 점화식을 구할 수 있는지를 알아보는 문제이다.
아이디어는 수열의 최대 길이가 100,000이므로 모든 경우의 수를 점화식으로 표현해 구해보는 것이다.
점화식 정의
dp[N][L][R]=N개의 수열을 수행한 후 왼발의 위치가L, 오른발의 위치가R일 때 최소 누적 힘
이렇게 정의한다면 직전 수열까지 구한 최솟값을 이용해 해당 값을 구할 수 있다.
예를 들어 직전에 오른 다리가 2의 자리에 있었다가 현재
R자리로 이동했다면dp[N][L][R]의 최솟값 후보 중 하나로dp[N - 1][L][2] + (2 => R로 이동한 힘)이 될 수 있다.왼발을 움직일 때는 예를 들어
dp[N - 1][L'][R] + (L' => L로 이동한 힘)역시dp[N][L][R]의 최솟값 후보가 될 수 있다.즉, 한 발만 움직여
dp[N][L][R]의 위치를 만들 수 있는 모든 경우의 수를 비교해 최솟값을 이 위치에 저장하는 작접을 수행하면 문제를 해결할 수 있다.
손으로 풀어보기
점화식
dp[N][L][R]을 구한다.mp[i][j]를i에서j로 이동하는 데 드는 힘이라고 하면 직전에 오른발을 움직일 때 점화식은 다음과 같다.dp[N][L][R]=min(dp[N - 1][L][i] + mp[i][R])
직전에 왼발을 움직일 때는 다음과 같다.
dp[N][L][R]=min(dp[N - 1][i][R] + mp[i][L])
이 점화식을 왼발과 오른발을 구분해 두 발로 만들 수 있는 모든 경우를 고려해 반복해야 한다.
충분히 큰 수로 dp 테이블을 초기화하고, 점화식을 이용해 값을 채운다.
수열을 모두 수행한 후 최솟값을 출력한다.
슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated