기술 블로그

1562번 계단수 본문

알고리즘 문제/BOJ

1562번 계단수

parkit 2021. 3. 8. 22:16
728x90
반응형

www.acmicpc.net/problem/1562

 

1562번: 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

 

10844번 쉬운 계단 수에서

 

0 ~ 9를 방문했는지만 체크하면 된다.(차원을 하나 더 늘려서 비트마스킹 활용)

 

 

 

#include <bits/stdc++.h>

using namespace std;

#define Mod 1000000000
#define LL long long

// 1111111111(2) = 1023
// dp[a][b][c] : 길이 a, 끝자리 수 b, 방문표시 1 << c
int N;
LL dp[101][10][1 << 10];

int main(void)
{
    cin.tie(0);

    // 기저 사례
    // 길이가 1이면서, 끝자리가 i, 방문표시 1 << i
    for (int i = 1; i <= 9; i++) {
        dp[1][i][1 << i] = 1;
    }

    scanf("%d", &N);

    for (int i = 2; i <= N; i++) { // 길이
        for (int j = 0; j <= 9; j++) { // 끝자리
            for (int k = 1; k <= (1 << 10) - 1; k++) { // 방문표시
                if (j == 0) {
                    dp[i][j][k | (1 << j)] += dp[i - 1][1][k] % Mod;
                }
                else if (j == 9) {
                    dp[i][j][k | (1 << j)] += dp[i - 1][8][k] % Mod;
                }
                else {
                    dp[i][j][k | (1 << j)] += (dp[i - 1][j - 1][k] % Mod + dp[i - 1][j + 1][k] % Mod) % Mod;
                }
            }
        }
    }
    
    LL answer = 0;

    for (int i = 0; i <= 9; i++) {
        answer = (answer % Mod + dp[N][i][(1 << 10) - 1] % Mod) % Mod;
    }
    
    printf("%lld\n", answer);

    return 0;
}

 

 

 

728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

14391번 종이 조각  (0) 2021.04.01
17485번 진우의 달 여행 (Large)  (3) 2021.03.20
19237번 어른상어  (0) 2021.02.13
20055번 컨베이어 벨트 위의 로봇  (0) 2020.11.15
5525번 IOIOI  (0) 2020.06.23