• 백준 2096번 내려가기 [DP] :: 마이구미
    알고리즘 풀이/동적계획법 2017. 4. 4. 20:25
    반응형

    이번 글은 백준 알고리즘 2096번 문제 "내려가기"를 다뤄본다.

    이 문제는 동적계획법으로 해결할 수 있다.


    먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.

    별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오.


    문제를 이해하기에는 어렵지 않다.

    문제에서 명시해준 제약 조건만 이해하면 된다.


    제약조건을 2차원 배열로 표현하면, 이해가 빠를 것이다.


    arr[N][3] => N줄, 첫번째 칸, 두번째 칸, 세번째 칸으로 가정한다.


    arr[0][0] => 첫번째 줄의 첫번째 칸

    *두번째 줄의 첫번째 칸 또는 두번째 칸으로 이동 가능.


    arr[0][1] => 첫번째 줄의 두번째 칸

    *두번째 줄의 첫번째 칸 또는 두번째 칸 또는 세번째 칸으로 이동 가능.


    arr[0][2] => 첫번째 줄의 세번째 칸

    *두번째 줄의 두번째 칸 또는 세번째 칸으로 이동 가능.


    위 배열은 문제에서 표현한 그림을 그대로 2차원 배열로 표현한 것이다.

    더욱 간단하게 보자면, 아래 그림으로 표현할 수 있다. 

    문제의 그림과 다른 것 없다. 화살표를 통해 조금 더 명확하게 표현했을 뿐이다.

    이유는 문제를 해결하기 위해 필요한 것은 이것이 전부이기 때문이다.


    2096번 내려가기



    이 제약 조건을 그대로 점화식으로 도출할 수 있다.


    첫번째 칸이 내려갈 수 있는 경우.

    dp[N][0] = max(dp[N-1][0], dp[N-1][1])


    두번째 칸이 내려갈 수 있는 경우.

    dp[N][1] = max(dp[N-1][0], dp[N-1][1], dp[N-1][2])


    세번째 칸이 내려갈 수 있는 경우.

    dp[N][2] = max(dp[N-1][1], dp(N-1][2])


    도출한 점화식을 통해 문제를 해결할 수 있다.


    for (int i = 1; i < n; i++) { max[i][0] += Math.max(max[i-1][0], max[i-1][1]); max[i][1] += Math.max(Math.max(max[i-1][0], max[i-1][1]), max[i-1][2]); max[i][2] += Math.max(max[i-1][1], max[i-1][2]); min[i][0] += Math.min(min[i-1][0], min[i-1][1]); min[i][1] += Math.min(Math.min(min[i-1][0], min[i-1][1]), min[i-1][2]); min[i][2] += Math.min(min[i-1][1], min[i-1][2]); }



    전체 소스는 아래 Github 링크를 참고하길 바란다.



    백준 알고리즘 2096번 내려가기 전체 소스

    https://github.com/hotehrud/acmicpc/blob/master/dp/2096.java

    반응형

    댓글

Designed by Tistory.