Skip to content

Commit bf29bb5

Browse files
YoonYn9915Mingguriguri
authored andcommitted
[BOJ] Dance Dance Revolution / 골드 3 / 80분
https://www.acmicpc.net/problem/2342
1 parent 559e71d commit bf29bb5

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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)

0 commit comments

Comments
 (0)