[BOJ] 10844번 쉬운 계단 수 - C++

"다이나믹 프로그래밍"

Posted by Yongmin on June 8, 2021

문제

쉬운 계단 수

풀이

dp[i][j]를 i개의 자릿수를 가지는 끝자리가 j인 쉬운 계단 수라고 정의한다. 쉬운 계단 수 중 끝자리가 0인 경우는 그 다음 자릿수의 끝자리가 오직 1로만 되고 같은 식으로 끝자리가 9인 경우는 오직 8로만 된다. 예를 들어, 10과 89는 오직 다음 자릿수의 쉬운 계단 수를 101, 898로만 만들어낸다. 그 나머지 경우는 각각 끝자리 수 + 1, 끝자리 수 - 1 을 이어 붙인 식으로 쉬운 계단 수를 만들어 낸다. 그러므로 점화식은 dp[i][j] = dp[i-1[j-1] + dp[i-1][j+1] 이며, 끝 자리 수가 0과 9인 경우는 각각 dp[i][j] = dp[i][j+1], dp[i][j] = dp[i][j-1]이 될 것이다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;

long long dp[100][10];

int main(){
    int N;
    scanf("%d", &N);
    
    for(int i = 1; i<10; i++){
        dp[1][i] = 1;
    }
    dp[1][0] = 0;
    
    for(int i = 2; i<=N; i++){
        for(int j = 0; j<10; j++){
            if(j == 0) dp[i][j] = dp[i-1][j+1]%1000000000;
            else if(j == 9) dp[i][j] = dp[i-1][j-1]%1000000000;
            else dp[i][j] = (dp[i-1][j+1] + dp[i-1][j-1])%1000000000;
        }
    }
    long long cnt = 0;
    
    for(int i = 0; i<10; i++){
        cnt = cnt + dp[N][i];
    }
    printf("%lld\n", cnt%1000000000);
    
    
    
    
}



# # #