2-2

행렬 경로 문제

  • nxn 행렬에서 오른쪽이나 아래쪽 방향으로만 이동 가능.

  • 방문한 칸에 있는 정수들의 합이 최소화되도록 하라.

다익스트라로 풀 수 있지만, 동적 계획법으로 풀어보자.(주제니까)

피보나치, 조합에 대해 순환식으로 풀어봤다. 얘네는 순환식이 주어져서 그대로 풀었다.

대부분의 동적계획법 알고리즘은 주어진 순환식을 푼다기 보다는

  • 문제를 풀기 위해 필요한 순환식을 스스로 수립.

  • 세워진 순환식을 메모이제이션, bottomUp으로 만드는건 처음엔 어렵지만 하다보면 기계적으로 풀게됨.

(i,j)에 도달하기 위해 (i, j-1) or (i-1, j) 까지 최선의 방법으로 이동해야함.

  • L[i,j] : (1,1)에서 (i,j)까지 이르는 최소합

    • m(i,j) // if i=1 and j=1

    • L(i-1, j) + m(i,j) // if j = 1;

    • L(i, j-1) + m(i,j) // if i = 1;

    • min(L(i-1, j), L(i, j-1)) + m(i,j) // otherwise, general case

순환식을 세울 때 가장 중요한 거

  • general Case

  • base case

위 2가지를 완전하게 세우는 것.

tom-down

bottom-up

왼쪽에 있는 값보다, 오른쪽에 있는 값이 먼저 계산되는 방식.

만약 경로를 구해야 한다면,

각 경로에 최소값인 이전경로의 값을 저장.

Summary

DP는 주어진 순환식을 푼다기 보다는, 문제를 풀기 위해 필요한 순환식을 스스로 수립. 세워진 순환식을 메모이제이션, bottomUp으로 만드는 건 처음엔 어려운데 기계적으로 풀게됨.

bottomUp으로 풀게 될 경우, 왼쪽에 있는 값보다 오른쪽에 있는 값이 먼저 계산됨.

Last updated

Was this helpful?