ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행렬에서 최대 경로 구하기
    Algorithm with C/DFS 2020. 9. 2. 00:11

    1. 문제

    2. 문제 분석

    행렬의 좌측상단에서 행렬의 원소( i, j )까지 도달하는 경로들의 점수 중 최고점을 구해보자.

     

    원소( i, j )에 도달하기 직전에 방문할 수 있는 행렬의 원소는 2개이다.

    즉, 원소( i-1, j ) 와 원소( i, j-1 ) 이다.

     

    원소( i, j )는 무조건 방문되므로, 원소( i, j )의 값은 반드시 더해진다.

    원소( i-1, j ) 거쳐서 원소( i, j )에 도달하는 경우와

    원소( i , j-1 ) 거쳐서 원소( i, j )에 도달하는 경우 중에서 점수가 높은 쪽을 택하면 된다.

    즉, (i-1,j)까지 도달하는 최고점수와 (i, j-1)까지 도달하는 최고 점수 중

    큰 것에 원소(i,j)의 점수를 더하면 원소 (i,j)까지 도달하는 최고 점수가 된다.

     

    위 점화식의 M은 둘 중에 높은 값을 선택하는 함수이다.

    (1). i = j = 1이면 원소( 1, 1 )에 이르는 최고점수를 구하는 것으로, 원소( 1, 1 )만 방문한다.

          그래서, 원소( 1, 1 )의 값이 답이다.

     

    (2). i = 1, j > 1이면 첫째 행의 한 원소에 이르는 최고점수를 구하는 것이다.

          첫째 행을 따라 오른쪽으로 수평 이동하는 방법밖에 없다.

           따라서, (1, j)의 바로 왼쪽 원소(1, j-1) 에 이르는 점수

           ( (1, j-1)에 이르는 유일한 점수이자 최고점수 ) 에 원소 (1,j)의 값을 더하면 된다.

     

    (3). i > 1, j = 1이면 첫째 열의 한 원소에 이르는 최고점수를 구하는 것이다.

          첫째 열을 따라 아래로 수직 이동하는 방법밖에 없다.

          따라서, (i,1)의 바로 위쪽 원소(i-1,1)에 이르는 점수

          ( (i-1,1)에 이르는 유일한 점수이자 최고 점수) 에 원소 (i,1)의 값을 더하면 된다.

     

    (4). 위의 3가지 경우가 아니면 원소( i , j )의 바로 왼쪽 원소에 이르는 최고 점수와

          원소( i , j )의 바로 위쪽 원소에 이르는 최고 점수중 큰 값에 원소( i , j )의 값을 더한 것이

          원소 (i,j)에 이르는 최고 점수이다.

     

    3. 알고리즘 수도 코드

     

    4. 구현

    프로그램 실행결과

    5. 소스 파일

    main.c
    0.00MB

     

    6. 보완할 점

    위의 방식에서는 중복 호출이 일어난다.

    그러므로, 동적 프로그래밍의 좋은 대상임을 알 수 있다.

    아래는 동적 프로그래밍의 알고리즘 수도 코드이다.

     

    아래는 구현 부분.

    프로그램 실행결과

     

    소스 파일

    main.c
    0.00MB

    'Algorithm with C > DFS' 카테고리의 다른 글

    출근길은 즐거워  (0) 2020.09.02
    출근길  (0) 2020.09.02
    숙직 선생님  (0) 2020.08.31
    Binary Search Tree  (0) 2020.08.31
    4종류 동전으로 N 센트를 표현하는 경우의 수  (0) 2020.08.27

    댓글

Designed by Tistory.