1+ '''
2+ BOJ #2342. Dance Dance Revolution (골λ3)
3+ https://www.acmicpc.net/problem/2342
4+ μ ν: Dynamic Programing
5+ '''
6+ import sys
7+ input = sys .stdin .readline
8+ INF = int (1e9 )
9+ commands = list (map (int ,input ().split ()))[:- 1 ]
10+
11+ # μ΄μ μ§μ μμ νμ¬ μ§μ μΌλ‘ μ΄λν λ λλ power κ° λ°ν
12+ def getPower (before_foot , current_foot , preview_power ) :
13+ add_power = 0
14+ if before_foot == current_foot :
15+ add_power = 1
16+ elif before_foot == 0 and current_foot != 0 :
17+ add_power = 2
18+ elif abs (before_foot - current_foot )== 2 : # μΈμ μ§μ λλ₯Ό κ²½μ°
19+ add_power = 4
20+ else : # λ°λνΈ μ§μ λλ₯Ό κ²½μ°
21+ add_power = 3
22+ return preview_power + add_power
23+
24+
25+ #1.dp μ΄κΈ°ν (νμ¬ L , R μμΉ , λμ power)
26+ # 3μ°¨μ : dp[level][r][l] = λμ power
27+ dp = [[[INF for k in range (5 )] for i in range (5 )] for _ in range (len (commands )+ 1 )]
28+ dp [0 ][0 ][0 ] = 0
29+
30+ # # #2. λ°λ³΅λ¬ΈμΌλ‘ dp μ νμ(memorization) ꡬν
31+ cur_r ,cur_l = 0 ,0
32+ # κ° κ²μ λ¨κ³λ³λ‘ μ
λ°μ΄νΈ
33+ for level in range (1 ,len (commands )+ 1 ):
34+ target = commands [level - 1 ] # ν λ¨κ³μμ μ΄λν μ리
35+
36+ for r in range (5 ) :
37+ for l in range (5 ) :
38+ # μ΄μ μ
λ°μ΄νΈ λ r, l μ κ²½μ°μ μμ νμ (μ΅μ ν)
39+ if dp [level - 1 ][r ][l ] != INF :
40+ cur_p = dp [level - 1 ][r ][l ]
41+ # (1) μ€λ₯Έ λ°λ§ μ΄λνλ κ²½μ°
42+ dp [level ][target ][l ]= min (dp [level ][target ][l ],getPower (r ,target ,cur_p ))
43+ #(2) μΌ λ°λ§ μ΄λνλ κ²½μ°
44+ dp [level ][r ][target ]= min (dp [level ][r ][target ],getPower (l ,target ,cur_p ))
45+
46+ # 3. μ΅μ’
λ¨κ³μμ μ΅μ ν μΆλ ₯
47+ result = INF
48+ for i in range (5 ):
49+ for k in range (5 ):
50+ result = min (result , dp [- 1 ][i ][k ])
51+
52+ print (result )
0 commit comments