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