Algorithm

DP_백준_쉬운 계단 수_10844

MoYoungmin 2018. 8. 16. 13:09

마지막에 무슨 수가 들어 가는지를 모른다. 따라서 길이가 N이고 마지막 상태를 나타내는 L로 2차원 배열을 사용한다.


1. 정의 : dp[N][L] : 길이가 N이고 마지막 숫자가 L일때 총 계단 수의 갯수

2. 점화식 : dp[N][L] = dp[N-1][L-1] + dp[N-1][L+1] (1<=L<=8)

              dp[N][0] = dp[N-1][1]

              dp[N][9] = dp[N-1][8]

3. 초기화 : 코드 참조

시간 복잡도는 O(N)이다.


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;
 
int main() {
    int num;
    long long d[101][10];
    for (int i = 1; i <= 9; i++) {
        d[1][i] = 1;
    }
    d[1][0= 0;
 
    cin >> num;
    for (int i = 2; i <= num; i++) {
        for (int k = 0; k <= 9; k++) {
            if (k == 0) {
                d[i][0= d[i - 1][1];
            }
            if (k == 9) {
                d[i][9= d[i - 1][8];
            }
            if (k >= 1 && k <= 8) {
                d[i][k] = (d[i - 1][k - 1+ d[i - 1][k + 1]) % 1000000000;
            }
        }
    }
 
    long long sum = 0;
    for (int i = 0; i <= 9; i++) {
        sum += d[num][i];
        sum %= 1000000000;
    }
    cout << sum << endl;
}
cs