[Baekjoon] 1562๋ฒ: ๊ณ๋จ ์
๐ฅ ๋ฌธ์
https://www.acmicpc.net/problem/1562
๐ ์ค๊ณ
0~9๊น์ง์ ๋ชจ๋ ์๋ฅผ ํฌํจํ๋ ๊ณ๋จ ์๊ฐ ๋ช ๊ฐ์ธ์ง ๊ตฌํด์ผ ํ๋ค.
๊ธธ์ด๊ฐ n์ธ ๊ฒ์ด n+1์ธ ๊ณ๋จ ์๋ฅผ ์ด๋ฃจ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ผ๋ฏ๋ก, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ๋ค.
์ฌ์ฉํ ์ซ์๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํด ๋นํธ๋ง์คํน์ ์ด์ฉํ๋ค. 9๋ง ์ฌ์ฉ๋์๋ค๋ฉด, ์ด์ง์๋ก 1000000000์ธ 512์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
dp[์ฌ์ฉํ ์ซ์][๊ธธ์ด][๋ง์ง๋ง ์ซ์]๋ก ๊ตฌ์ํ๋ค. ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ฏ๋ก, ์ด๊น๊ฐ์ ์ค์ ํด์ผ ํ๋๋ฐ, ๊ธธ์ด๊ฐ 1์ด๋ผ๋ฉด, ๊ณ๋จ ์์ ๊ฐ์๋ ๊ทธ ์๋ง ํด๋น๋๋ฏ๋ก 1๋ก ์ค์ ํ๋ค.
๊ธธ์ด๊ฐ 2 ์ด์์ผ ๋, 0์ผ๋ก ๋๋๋ค๋ฉด ๋ง์ง๋ง ์๊ฐ 1๋ง ๋๊ณ , 9๋ก ๋๋๋ค๋ฉด ๋ง์ง๋ง ์๊ฐ 8๋ง ๋๊ณ , ๊ทธ ์ฌ์ด๋ผ๋ฉด ๋ง์ง๋ง ์๋ ± 1์ด ๋๋ค. ์๋ก์ด ๋ง์ง๋ง ์๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด or ์ฐ์ฐํ์ฌ ๊ธฐ๋กํ๋ค.
๐ ํ์ด
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, MOD = 1e9;
long long dp[1 << 10][101][10];
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
if (n <= 9) {
cout << 0 << endl;
return 0;
}
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 <= 9; j++) {
for (int k = 0; k < (1 << 10); k++) {
if (j == 0) {
dp[k | (1 << j)][i][j] += dp[k][i - 1][j + 1] % MOD;
}
else if (j == 9) {
dp[k | (1 << j)][i][j] += dp[k][i - 1][j - 1] % MOD;
}
else {
dp[k | (1 << j)][i][j] += (dp[k][i - 1][j - 1] + dp[k][i - 1][j + 1]) % MOD;
}
}
}
}
long long answer = 0;
for (int i = 0; i <= 9; i++) {
answer = (answer + dp[(1 << 10) - 1][n][i]) % MOD;
}
cout << answer << "\n";
return 0;
}