728x90

 0. [c++] 백준  - 


https://www.acmicpc.net/problem/1562


 1. 풀이


숫자를 한자리씩 계단 수 규칙을 유지하며 증가시켜주자.


처음 시작은 0을 제외한 1~9를 seed로 cache가 쌓이게 된다.


시작이 다른 9개의 수이므로 중복은 발생하지 않고, 비트마스크를 활용하여 방문한 수를 저장해주었다.



 2. 소스코드

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
 
using namespace std;
 
const int INF = 1000000000;
int N;
int cache[101][10][1 << 10];
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> N;
 
    for (int i = 1; i < 10; i++) {
        cache[1][i][1 << i] = 1;
    }
 
    //for (int order = 2; order <= N; order++) {
    //    for (int num = 0; num < 10; num++) {
    //        for (int visited = 0; visited < (1 << 10); visited++) {
    //            if (num == 0) {
    //                cache[order][num][visited | (1 << num)] = (cache[order][num][visited | (1 << num)] + cache[order - 1][num + 1][visited]) % INF;
    //            }
    //            else if (num == 9) {
    //                cache[order][num][visited | (1 << num)] = (cache[order][num][visited | (1 << num)] + cache[order - 1][num - 1][visited]) % INF;
    //            }
    //            else {
    //                cache[order][num][visited | (1 << num)] = (cache[order][num][visited | (1 << num)] + cache[order - 1][num - 1][visited]) % INF;
    //                cache[order][num][visited | (1 << num)] = (cache[order][num][visited | (1 << num)] + cache[order - 1][num + 1][visited]) % INF;
    //            }
    //            
    //        }
    //    }
    //}
 
    for (int order = 1; order < N; order++) {
        for (int num = 0; num < 10; num++) {
            for (int visited = 0; visited < (1 << 10); visited++) {
                if (cache[order][num][visited] == 0)
                    continue;
                if (num == 0) {
                    cache[order + 1][1][visited | (1 << 1)] = (cache[order + 1][1][visited | (1 << 1)] + cache[order][num][visited]) % INF;
                }
                else if (num == 9) {
                    cache[order + 1][8][visited | (1 << 8)] = (cache[order + 1][8][visited | (1 << 8)] + cache[order][num][visited]) % INF;
                }
                else {
                    cache[order + 1][num + 1][visited | (1 << (num + 1))] = (cache[order + 1][num + 1][visited | (1 << (num + 1))] + cache[order][num][visited]) % INF;
                    cache[order + 1][num - 1][visited | (1 << (num - 1))] = (cache[order + 1][num - 1][visited | (1 << (num - 1))] + cache[order][num][visited]) % INF;
                }
 
            }
        }
    }
 
    int ret = 0;
 
    for (int i = 0; i < 10; i++) {
        ret = (ret + cache[N][i][(1 << 10- 1]) % INF;
    }
 
    cout << ret << endl;
 
    return 0;
}
cs

 3. 참고




질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts