|
| 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