Skip to content

Commit 9236087

Browse files
committed
[BOJ]#17484. 진우의달여행/실버3/실패
https://www.acmicpc.net/problem/17484
1 parent fc76ef6 commit 9236087

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"""
2+
https://www.acmicpc.net/problem/17484
3+
4+
# 문제
5+
- N x M 행렬
6+
1. 이동 방향 - 최하 , 하 , 우하
7+
2. 2번 연속 동일 방향 선택 불가
8+
3. 반드시 달 도착
9+
goal ) 최소 연료
10+
11+
12+
"""
13+
import sys
14+
input = sys.stdin.readline
15+
16+
n, m = map(int, input().split())
17+
board = [list(map(int, input().split())) for _ in range(n)]
18+
dp = [[[0] * m for _ in range(n)] for _ in range(3)] # 3차원배열 DP
19+
ans = sys.maxsize # 임의의 큰 값
20+
21+
for z in range(3):
22+
for y in range(m):
23+
dp[z][0][y] = board[0][y] # 초기 DP 초기화
24+
25+
for x in range(1, n):
26+
for y in range(m):
27+
if y == 0:
28+
# 가장 첫 번째 열인 경우
29+
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
30+
# 아래 방향(dp[1])의 경우, 오른쪽 위에서 왼쪽 아래 방향으로 진행하는 값만 받을 수 있음
31+
# 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
32+
# dp[0][x][y] = dp[1][x - 1][y]
33+
dp[1][x][y] = dp[0][x - 1][y + 1]
34+
dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])
35+
elif y == m - 1:
36+
# 가장 마지막 열인 경우
37+
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
38+
# 아래 방향(dp[1])의 경우, 왼쪽 위에서 오른쪽 아래 방향으로 진행하는 값만 받을 수 있음
39+
# 대각선 오른쪽 방향(dp[2])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
40+
dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
41+
dp[1][x][y] = dp[2][x - 1][y - 1]
42+
# dp[2][x][y] = dp[1][x - 1][y]
43+
else:
44+
# 중간 열인 경우
45+
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
46+
# 아래 방향(dp[1])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
47+
# 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
48+
dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
49+
dp[1][x][y] = min(dp[0][x - 1][y + 1], dp[2][x - 1][y - 1])
50+
dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])
51+
52+
for z in range(3): # 원래 자신의 좌표값 더함
53+
dp[z][x][y] += board[x][y]
54+
55+
for z in range(3): # 3차원 배열 중 마지막 행의 최솟값을 찾음
56+
ans = min(ans, min(dp[z][-1]))
57+
58+
print(ans)

0 commit comments

Comments
 (0)