본문 바로가기

알고리즘/백준

[BOJ 1562] 계단 수

DP를 이용해서 문제를 풀 때, N만으로는 문제를 해결할 수 없다.

 

 

 

추가적으로 정보가 필요한데, 끝자리 수와 0~9 비트마스크가 필요하다.

 

 

 

끝자리 수를 다음에 올 수 있는 수를 확인하고, 0~9 비트마스크를 조작할 것이다.

 

 

 

i = N

j = 끝자리의 수

k = 0~9 비트마스크(0 ~ 1023)

 

 

 

위의 정보를 이용해서 점화식을 세우면 된다.

 

 

 

 

해설코드(C++).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cmath>
#define mod 1000000000
 
using namespace std;
 
long long dp[101][10][1024];
int N;
 
int main() {
    cin >> N;
    
    for(int i = 1; i <= 9; i++)
        dp[1][i][1 << i] = 1;
        
    for(int i = 2; i <= N; i++){
        for(int j = 0; j < 10; j++){
            for(int k = 1; k < 1024; k++){
                if(j == 0){
                    dp[i][0][k | 1 << 0+= dp[i - 1][1][k] % mod;    
                }
                else if(j == 9){
                    dp[i][9][k | 1 << 9+= dp[i - 1][8][k] % mod;
                }else{
                    dp[i][j][k | 1 << j] += dp[i - 1][j - 1][k] % mod;
                    dp[i][j][k | 1 << j] += dp[i - 1][j + 1][k] % mod;
                }
            }
        }
    }
    
    long long answer = 0;
    for(int k = 0; k < 10; k++){
        answer = (answer + dp[N][k][1023]) % mod;
    }
    
    cout << answer << endl;
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ 2309] 일곱 난쟁이  (0) 2020.05.19
[BOJ 1254] 팰린드롬 만들기  (0) 2020.05.19
[BOJ 2618] 경찰차  (0) 2020.05.15
[BOJ 1256] 사전  (0) 2020.05.05
[BOJ 1509] 팰린드롬 분할  (0) 2020.05.03