File tree Expand file tree Collapse file tree 1 file changed +50
-0
lines changed
Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change 1+ import sys
2+
3+ sys .setrecursionlimit (10 ** 8 )
4+ input = lambda : sys .stdin .readline ().rstrip ()
5+
6+ MAX = 400000
7+
8+
9+ def get_add (lr , k ): # 어떤 발이 k->lr 발로 갈 때 드는 비용
10+ if k == 0 :
11+ if lr == 0 :
12+ return 0
13+ else :
14+ return 2
15+ elif k == lr :
16+ return 1
17+ elif abs (k - lr ) == 1 or abs (k - lr ) == 3 :
18+ return 3
19+ else :
20+ return 4
21+
22+
23+ move = list (map (int , input ().split ()))
24+ move .pop ()
25+ n = len (move )
26+ if n == 0 :
27+ print (0 )
28+ exit ()
29+
30+ dp = [[[MAX + 1 for _ in range (5 )] for _ in range (5 )] for _ in range (n + 1 )]
31+ dp [- 1 ][0 ][0 ] = 0
32+
33+ for i in range (n ):
34+ # l = move[i], 왼발로 이번 위치 누를 때, 즉 이번에 왼발이 움직일 것
35+ for r in range (5 ): # 왼발이 움직이니 오른발은 고정
36+ for k in range (5 ): # k 는 왼발의 이전 위치.
37+ add = get_add (move [i ], k ) # 왼발이 k에서 move[i]로 움직일 때 드는 비용
38+ dp [i ][move [i ]][r ] = min (dp [i ][move [i ]][r ], dp [i - 1 ][k ][r ] + add )
39+
40+ # r = move[i], 오른발로 이번 위치 누를 때, 즉 이번에 오른발이 움직일 것
41+ for l in range (5 ): # 오른발이 움직이니 왼발은 고정
42+ for k in range (5 ): # k는 오른발의 이전 위치.
43+ add = get_add (move [i ], k ) # 오른발이 k에서 move[i]로 움직일 때 드는 비용
44+ dp [i ][l ][move [i ]] = min (dp [i ][l ][move [i ]], dp [i - 1 ][l ][k ] + add )
45+
46+ m = MAX + 1
47+ for l in range (5 ):
48+ for r in range (5 ):
49+ m = min (m , dp [n - 1 ][l ][r ])
50+ print (m )
You can’t perform that action at this time.
0 commit comments