오늘의 알고리즘

[C++] 백준 2342 Dance Dance Revolution

하늘하늘 . 2022. 11. 28. 23:49
#include <iostream>
#include <vector>
 
std::vector<int> vec = {};
int dp[5][5][100001] = {};
 
int move(int cur, int next)
{
    if (cur == next)
        return 1;
 
    else if (!cur)
        return 2;
 
    else if (abs(cur - next) == 2)
        return 4;
 
    return 3;
}
 
int DFS(int left, int right, int index) 
{
    if (index >= vec.size())
        return 0;
 
    int& next = dp[left][right][index];
 
    if (next)
        return next;
 
    next = std::min(move(left, vec[index]) + DFS(vec[index], right, index + 1),
        move(right, vec[index]) + DFS(left, vec[index], index + 1));
 
    return next;
}
 
int main() 
{
    int N = 0;
    while (true) 
    {
        std::cin >> N;
        if (!N)
        {
            break;
        }
 
        vec.push_back(N);
    }
 
    std::cout << DFS(0, 0, 0);
 
    return 0;
}
 
 

처음엔 왼쪽이든 오른쪽이든 한쪽으로 무조건 3일 줄 알았는데 4도 나오더라...

결국엔 예전에 풀어본 3가지 길로 풀었던 것처럼 왼쪽이랑 오른쪽으로 나눠서 계속해서 길을 계산해가면서 풉니다.

완전 탐색과 비슷하지만 계싼해가면서 가장 짧은 길을 구해서 갑니다.