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