참조: https://www.youtube.com/watch?v=Rn9G6VrBKb4&t=621s

 

#include<iostream>

using namespace std;

int modular = 1000000000;
int main(void) {
	int n;
	cin >> n;
	long long arr[100][10];
	arr[0][0] = 0;
	for (int x = 1; x < 10; ++x) {
		arr[0][x] = 1;
	}
	for (int y = 1; y < n; ++y) {
		for (int x = 0; x < 10; ++x) {
			if (x == 0) {
				arr[y][x] = arr[y-1][1] % modular;
			}
			else if (x == 9) (arr[y][x] = arr[y - 1][8]) % modular;
			else {
				arr[y][x] = (arr[y - 1][x - 1] + arr[y - 1][x + 1]) % modular;
			}
		}
	}
	long long sum = 0;
	for (int x = 0; x < 10; ++x) {
		sum += arr[n - 1][x];
	}
	cout << sum % modular << endl;
}

 

자릿수 마지막의 값(행)&&
자릿수(열) 1 2 3
0 1 1
1 1 1 3
2 1 2 3
3 1 2 4
4 1 2 4
5 1 2 4
6 1 2 4
7 1 2 4
8 1 2 3
9 1 1 2

자릿수가 첫째자리 인경우 마지막 값이 0인 경우는 존재하지 않으니 0

마지막 값이 1 ~9는 각각 1개 씩 존재.

자릿수가 2개인 경우

10, 12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98 로

마지막값이 0인 경우는 1, 1인 경우는 21로 1나. 마지막값이 9인경우는 89 하나, 나머지 값들은 각 2개 씩 존재.

3 또한 동일한 방식으로 3개의 자릿수의 값에 마지막 값이 0 ~ 9로오는 갯수를 각각 구한다.

그러면 규칙이 보이는데 마지막 값이 0과 9를 제외하고는 나머지는 arr[y][x] = a[y-1][x-1] + a[y-1][x+1]이다. 마지막값이 0과9의 경우는 각각 이전 행의 1번째 열과 8번째 열을 그대로 사용한다.

고로 0과 9의 경우는 arr[y][0] = arr[y-1][1] , arr[y][9] = arr[y-1][8]이 된다.

초기에만 첫째자리가 1인 경우 0 번째 원소: 0 , 1~9 번째 원소 : 1 로 초기화해준다. 그 후 점화식을 통한 계산을 한다.

단, 오버플로우를 방지하기 위해 각 계산식에 modular 연산을 추가한다.

'PS > 백준' 카테고리의 다른 글

[한양대 HCPC 2023] Pipelined (백준: 30874번)  (0) 2024.11.01
15686 치킨배달  (0) 2024.08.22
1062번 가르침 [다시보기]  (0) 2024.07.24
한국이 그리울 땐 서버에 접속하지  (0) 2023.08.26
1931번 회의실배정 (V)  (0) 2023.07.19

+ Recent posts