κ³λ¨μ
λ¬Έμ μ μλ³Έμ μ¬κΈ°μ νμΈνμΈμ.
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- λΉνΈλ§μ€νΉ
λΉνΈλ§μ€νΉμ μ΄μ©νμ¬ μ΄λ€ μλ₯Ό μ¬μ©νλμ§ μ¬μ©νμ§ μμλμ§ νννλ€.
λΉνΈλ§μ€νΉμΌλ‘ 0, 1, 2, 3, 4μ μ«μλ₯Ό μ¬μ©νλ€λ©΄ μλμ κ°μ΄ λνλΌ μ μλ€.
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
0~9λ₯Ό λͺ¨λ μ¬μ©ν μνλ 1111111111
λ‘ λνλΌ μ μλ€. μ¦ μ΅λκ°μ 1023μ΄ λλ€.
dp[i][j][k]
* i : iκΈΈμ΄μ μμμ
* j : jλ‘ λλλ©΄μ
* k : kμ λ§νΉλ μνμ μ«μλ€μ μ΄μ©ν
κ³λ¨μμ κ°μ
λΌκ³ μ μν λ,
dp[i][j][k] += 1 (i = 1)
+= dp[i - 1][j - 1][k] (i != 1, 0 < j)
+= dp[i - 1][j + 1][k] (i != 1, j < 9)
μ νμμ μμ κ°μ΄ λνλΌ μ μλ€. μ¬κΈ°μ 1,000,000,000μΌλ‘ λλ λλ¨Έμ§κ° ν΄κ° λλ€λ μ μ κΈ°μ΅ν΄μΌνλ€.
#include <bits/stdc++.h>
#define MOD 1000000000
#define ALL_USED 0b1111111111
using namespace std;
long long dp[101][10][ALL_USED + 1];
long long solve(int n) {
for (int i = 1; i < 10; i++) {
dp[1][i][1 << i] = 1;
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= ALL_USED; k++) {
int bit = k | (1 << j);
if (0 < j) {
dp[i][j][bit] += dp[i - 1][j - 1][k];
dp[i][j][bit] %= MOD;
}
if (j < 9) {
dp[i][j][bit] += dp[i - 1][j + 1][k];
dp[i][j][bit] %= MOD;
}
}
}
}
long long sum = 0;
for (int i = 0; i < 10; i++) {
sum += dp[n][i][ALL_USED];
sum %= MOD;
}
return sum;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
cout << solve(n) << "\n";
return 0;
}