Skip to content

Commit 6f00ce5

Browse files
committed
계단수
1 parent 5c91673 commit 6f00ce5

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

challenges/BOJ1562.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# 문제
2+
계단수
3+
## 문제 원본
4+
문제의 원본은 [여기서](https://www.acmicpc.net/problem/1562) 확인하세요.
5+
6+
## 분류
7+
* 다이나믹 프로그래밍
8+
* 비트마스킹
9+
10+
# 풀이
11+
12+
13+
14+
비트마스킹을 이용하여 어떤 수를 사용했는지 사용하지 않았는지 표현한다. 비트마스킹으로 0, 1, 2, 3, 4의 숫자를 사용했다면 아래와 같이 나타낼 수 있다.
15+
16+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
17+
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
18+
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
19+
20+
0~9를 모두 사용한 상태는 `1111111111`로 나타낼 수 있다. 즉 최대값은 1023이 된다.
21+
22+
```
23+
dp[i][j][k]
24+
* i : i길이의 수에서
25+
* j : j로 끝나면서
26+
* k : k에 마킹된 상태의 숫자들을 이용한
27+
계단수의 개수
28+
```
29+
30+
라고 정의할때,
31+
32+
```
33+
dp[i][j][k] += 1 (i = 1)
34+
+= dp[i - 1][j - 1][k] (i != 1, 0 < j)
35+
+= dp[i - 1][j + 1][k] (i != 1, j < 9)
36+
```
37+
38+
점화식은 위와 같이 나타낼 수 있다. 여기서 1,000,000,000으로 나눈 나머지가 해가 된다는 점을 기억해야한다.
39+
40+
``` c++
41+
#include <bits/stdc++.h>
42+
43+
#define MOD 1000000000
44+
#define ALL_USED 0b1111111111
45+
46+
using namespace std;
47+
48+
long long dp[101][10][ALL_USED + 1];
49+
50+
long long solve(int n) {
51+
for (int i = 1; i < 10; i++) {
52+
dp[1][i][1 << i] = 1;
53+
}
54+
55+
for (int i = 2; i <= n; i++) {
56+
for (int j = 0; j <= 9; j++) {
57+
for (int k = 0; k <= ALL_USED; k++) {
58+
int bit = k | (1 << j);
59+
60+
if (0 < j) {
61+
dp[i][j][bit] += dp[i - 1][j - 1][k];
62+
dp[i][j][bit] %= MOD;
63+
}
64+
if (j < 9) {
65+
dp[i][j][bit] += dp[i - 1][j + 1][k];
66+
dp[i][j][bit] %= MOD;
67+
}
68+
}
69+
}
70+
}
71+
72+
long long sum = 0;
73+
for (int i = 0; i < 10; i++) {
74+
sum += dp[n][i][ALL_USED];
75+
sum %= MOD;
76+
}
77+
78+
return sum;
79+
}
80+
81+
int main(void) {
82+
ios::sync_with_stdio(false);
83+
cin.tie(0); cout.tie(0);
84+
85+
int n;
86+
cin >> n;
87+
88+
cout << solve(n) << "\n";
89+
90+
return 0;
91+
}
92+
```

0 commit comments

Comments
 (0)