본문 바로가기
BOJ

백준(BOJ) 2342 Dance Dance Revolution(Python)

by juLeena 2022. 7. 14.

문제 내용

 

DP 문제.

처음에는 2차원으로 생각해서 풀려고 했는데 안 돼서 3차원으로 풀었다.

각 시행마다 오른발, 왼발이 놓인 위치를 DP로 구현했다.

5*5*100000이라 꽤 여유있었다.

 

코드는 다음과 같다.

 

# -*- coding: utf-8 -*-
import sys
from collections import deque
import heapq
import copy
#input=sys.stdin.readline
#sys.setrecursionlimit(100000000)

L=list(map(int,input().split()))
INF=10e9
dp=[[[INF for k in range(5)] for j in range(5)] for i in range(len(L))]
check={1:3,2:4,3:1,4:2}
dp[0][0][0]=0
for i in range(1,len(L)):
    p=L[i-1]
    for j in range(5):
        for k in range(5):
            x=dp[i-1][j][k]
            if x<INF:
                if p!=k:
                    if j==0:
                        dp[i][p][k]=min(dp[i][p][k],x+2)
                    elif p==check[j]:
                        dp[i][p][k]=min(dp[i][p][k],x+4)
                    else:
                        dp[i][p][k]=min(dp[i][p][k],x+3)
                else:
                    dp[i][j][k]=min(dp[i][j][k],x+1)
                if p!=j:
                    if k==0:
                        dp[i][j][p]=min(dp[i][j][p],x+2)
                    elif p==check[k]:
                        dp[i][j][p]=min(dp[i][j][p],x+4)
                    else:
                        dp[i][j][p]=min(dp[i][j][p],x+3)
                else:
                    dp[i][j][k]=min(dp[i][j][k],x+1)
ans=INF
for i in range(5):
    k=min(dp[-1][i])
    ans=min(k,ans)
print(ans)

그나마 숨 좀 돌릴 만한 문제였다.

'BOJ' 카테고리의 다른 글

백준(BOJ) 3366 수열 줄이기(Python)  (0) 2022.07.16
백준(BOJ) 9328 열쇠(Python)  (0) 2022.07.15
백준(BOJ) 1881 공 바꾸기(Python)  (0) 2022.07.14
백준(BOJ) 11952 좀비(Python)  (0) 2022.07.14
백준(BOJ) 13265 색칠하기(Python)  (0) 2022.07.13