๐Ÿ‘Š PS/Algorithm

[Baekjoon] 1562๋ฒˆ: ๊ณ„๋‹จ ์ˆ˜

hades1 2024. 9. 16. 20:31

๐Ÿฅ… ๋ฌธ์ œ

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