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 |