본문으로 바로가기

백준 10844 - 쉬운 계단 수

category BOJ 백준/Dynamic Programming 2020. 10. 26. 22:32

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

 

10844번: 쉬운 계단 수

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

www.acmicpc.net

 

고려사항

- memo[len][num] 은 len 길이의 수 중 끝이 num 으로 끝나는 수의 개수.

- 끝 수가 0과 9일 때는 각각 길이가 1 짧은 수들 중 끝이 1, 8 로 끝나는 수의 개수이며

이 밖에는 길이가 1 짧은 수들 중 끝이 자신과 1 차이나는 수로 끝나는 수의 개수들을 더한다.

- memo[len][num] = memo[len-1][num+1] + memo[len-1][num-1]

- 계산 후 % 10억

- 스위치문을 썼는데 모든 끝 자리수를 탐방하니 0~9까지 반복문을 활용하면 더욱 코드를 깨끗하게 쓸 수 있을 꺼 같다..

 

#include <iostream>
#include <string.h>
using namespace std;

int n;
int memo[101][11];

int dp(int len, int num){
    int &v = memo[len][num];

    if(len <= 1){
        return v;
    }

    if(len == 2){
        switch (num) {
            case 0:
                v = 1;
                break;
            case 1:
                v = 1;
                break;
            case 9:
                v = 1;
                break;
            default:
                v = 2;
                break;
        }
        return v;
    }

    if(v != -1){
        return v;
    }

    switch (num) {
        case 0:
            v = dp(len-1,1);
            break;
        case 1:
            v = dp(len-1,0)+dp(len-1,2);
            break;
        case 2:
            v = dp(len-1,1)+dp(len-1,3);
            break;
        case 3:
            v = dp(len-1,2)+dp(len-1,4);
            break;
        case 4:
            v = dp(len-1,3)+dp(len-1,5);
            break;
        case 5:
            v = dp(len-1,4)+dp(len-1,6);
            break;
        case 6:
            v = dp(len-1,5)+dp(len-1,7);
            break;
        case 7:
            v = dp(len-1,6)+dp(len-1,8);
            break;
        case 8:
            v = dp(len-1,7)+dp(len-1,9);
            break;
        case 9:
            v = dp(len-1,8);
            break;
    }

    v %= 1000000000;
    return v;
}

int main() {
    cin>>n;
    int ans = 0;

    memset(memo,-1,101*11*4);
    memo[0][0] = 0;
    memo[1][0] = 0;
    for(int i=1;i<10;++i){
        memo[0][i] = 0;
        memo[1][i] = 1;
    }

    for(int i=0;i<10;++i){
        ans += dp(n,i);
        ans %= 1000000000;
    }

    cout<<ans;
    return 0;
}