Code/BOJ

#17485 진우의 달 여행(Large)

milkteagood 2020. 3. 5. 16:56
728x90
반응형

출처:https://www.acmicpc.net/problem/17485

 

17485번: 진우의 달 여행 (Large)

첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2 ≤ N, M ≤ 1000)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.

www.acmicpc.net

 

문제:

우주비행이 꿈이였던 진우는 음식점 '매일매일싱싱'에서 열심히 일한 결과 달 여행에 필요한 자금을 모두 마련하였다! 지구와 우주사이는 N X M 행렬로 나타낼 수 있으며 각 원소의 값은 우주선이 그 공간을 지날 때 소모되는 연료의 양이다.

[예시]

진우는 여행경비를 아끼기 위해 조금 특이한 우주선을 선택하였다. 진우가 선택한 우주선의 특징은 아래와 같다.

1. 지구 -> 달로 가는 경우 우주선이 움직일 수 있는 방향은 아래와 같다.

2. 우주선은 전에 움직인 방향으로 움직일 수 없다. 즉, 같은 방향으로 두번 연속으로 움직일 수 없다.

진우의 목표는 연료를 최대한 아끼며 지구의 어느위치에서든 출발하여 달의 어느위치든 착륙하는 것이다.

최대한 돈을 아끼고 살아서 달에 도착하고 싶은 진우를 위해 달에 도달하기 위해 필요한 연료의 최소값을 계산해 주자.

 

입력

첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2 ≤ N, M ≤ 1000)이 주어진다.

다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.

 

출력

달 여행에 필요한 최소 연료의 값을 출력한다.

 

풀이

같은 방향으로 연속할 수 없다는 점을 염두해두고 dp로 점화식을 세워 풀이하는것이 핵심이다. 사용한 dp배열은 dp[1001][1001][3] //행, 열, 현재 진행할 방향 이라는 뜻으로 정의하였다. 그리고 방향이 0이면 좌하, 1이면 하, 2이면 우하 방향으로 진행한다는 뜻이다. 그래서 예를들어 열의 범위가 무한대라고 가정했을 경우 dp[2][2][1] 은 2행 2열에서 1의 방향(하)으로 진행한다라는 뜻이고 이때 dp[2][2][1]은 다음과 같이 정의한다. dp[2][2][1]=min(dp[1][1][2],dp[1][3][0])+2행2열의 가중치 값  => 이 뜻은 2행2열에서 1방향 (하 방향) 으로 갈 수 있다는 것은 그 전 상황인 1행 1열에서 우 하 방향으로 오거나, 1행 3열에서 좌 하 방향으로 온 것중 최솟값을 골라야 한다는 의미이다. 그리고 1행 2열에서 하 방향으로 들어온 값은 같은 현재와 방향이므로 최솟값선정에 적용시킬 수 없다.  그래서 dp[1][1][2],dp[1][3][0] 이 두가지만 고려한다.

 

 

코드

 

728x90
반응형