

2차원 배열 dp[x][y]에 sol[x][y]의 결과를 저장하고
이미 방문하여 계산을 마친 [x,y] 는 사전에 저장해놓은 dp[x][y]를 사용하여 계산해 반복 계산을 줄인다.
계단 수의 경우의 수는 한칸 아래 혹은 한칸 위 뿐이므로 가장 작은 수 0과 가장 큰 수 9를 예외로 두고
if (x == 0) 
dp[x][y] += sol(x + 1, y + 1); 
else if (x == 9) 
dp[x][y] += sol(x - 1, y + 1); 
else { 
dp[x][y] += sol(x - 1, y + 1); 
dp[x][y] += sol(x + 1, y + 1); 
}
다음과 같은 형식으로 재귀 형태로 구성하며
if (y == n - 1) { 
dp[x][y] = 1; 
return dp[x][y]; 
}
가장 높은 자릿수에서는 더이상 반복하지 않고 1 을 return 한다.
코드
#include<iostream>
#define MAX 101
#define N 10
using namespace std;
long long dp[N][MAX] = { 0 };
int n;
long long sol(int x, int y) {
	//이미 방문한 경우
	if (dp[x][y] != 0)
		return dp[x][y];
	//기저
	if (y == n - 1) {
		dp[x][y] = 1;
		return dp[x][y];
	}
	if (x == 0)
		dp[x][y] += sol(x + 1, y + 1);
	else if (x == 9)
		dp[x][y] += sol(x - 1, y + 1);
	else {
		dp[x][y] += sol(x - 1, y + 1);
		dp[x][y] += sol(x + 1, y + 1);
	}
	return dp[x][y] % 1000000000;
}
int main() {
	cin >> n;
	long long sum = 0;
	for (int i = 1; i < 10; i++)
		sum += sol(i, 0);
	cout << sum % 1000000000 << endl;
	return 0;
}
결과

'알고리즘' 카테고리의 다른 글
| [BAEKJOON 10942번] (C++) 팰린드롬? (0) | 2020.09.28 | 
|---|---|
| [BAEKJOON 2104번] (C++) 부분배열 고르기 (0) | 2020.09.16 | 
| [BAEKJOON 1725번] (C++) 히스토그램 (0) | 2020.09.16 | 
| [BAEKJOON 1074번] (C++) Z (0) | 2020.09.15 | 
| [BAEKJOON 1992번] (C++) 쿼드트리 (0) | 2020.09.15 |