오늘의 알고리즘

[C++] 백준 1562 계단 수

하늘하늘 . 2022. 11. 18. 22:57

 

#include <iostream>
 
int DP[10][101][1024] = {};
int N = 0;
 
int DFS(int num, int digit, int bit) 
{
    if (DP[num][digit][bit])
    {
        return DP[num][digit][bit];
    }
 
    if (digit == N) 
    {
        if (bit == 1023)
            return 1;
 
        else return 0;
    }
 
    int tmp = 0;
    int next = 0;
 
    if (num < 9) 
    {
        next = num + 1;
        tmp += DFS(next, digit + 1, (bit | 1 << (next)));
    }
 
    if (num > 0) 
    {
        next = num - 1;
        tmp += DFS(next, digit + 1, (bit | 1 << (next)));
    }
 
    tmp %= (int)10e8;
    DP[num][digit][bit] = tmp;
 
    return  DP[num][digit][bit];
}
 
int main() 
{
    std::cin >> N;
 
    int ans = 0;
 
    for (int i = 1; i <= 9; i++) 
    {
        ans += DFS(i, 1, 1 << i);
        ans %= (int)10e8;
    }
 
    std::cout << ans;
 
    return 0;
}

 

 

비트를 이용해서 문제를 풀어야했습니다.

처음엔 방법조차 몰랐는데 비트를 이용해서 문제를 풀었습니다.

DFS처럼 1 -> 2 -> 1or3 이런 방식으로 들어가면서 1을 입력했으면 1 << 1, 2는 1 << 2 이렇게 10개를 확인했어야 합니다.