백준/일반 문제

[백준/BOJ] 10844 - 쉬운 계단 수 (c++) (DP)

sem; 2022. 4. 9. 11:04
반응형

https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

위의 문제는 계단수의 성질와 DP를 이용하여 푸는 문제입니다.

 

맨 앞자리는 0이 오지못한다는 주의할 점도 있습니다.

 

맨뒷자리에 따라 뒤에 올 수 있는 수가 정해져있습니다.

 

맨 뒷자리가

 

0: 1,

1: 0, 2,

2: 1, 3,

...

8: 7, 9,

9: 8

 

이렇게 됩니다. 즉 인접하는 수의 전단계 계단수를 더하면 현재의 계단수를 구할 수 있게되는것입니다.

 

점화식으로 작성해보자면

 

dp[i][j]: 길이가 i이고 마지막 수가 j인 계단수의 개수

 

j=0 이면 dp[i][0] = dp[i-1][1]

j=9 이면 dp[i][9] = dp[i-1][8]

1≤j≤8 이면 dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

 

입니다.


소스코드

#include <iostream>
#define R 1000000000

using namespace std;

int n, ans, dp[101][10];

int main() {
	cin >> n;
	for (int i = 1; i < 10; i++) dp[1][i] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j < 9; j++) dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % R;
		dp[i][0] = dp[i - 1][1];
		dp[i][9] = dp[i - 1][8];
	}
	for (int i = 0; i < 10; i++) ans = (ans + dp[n][i]) % R;
	cout << ans;
}
반응형