백준[10844] - 쉬운계단수

문제

백준 10844 문제 보기

접근 방법

바로 앞의 수가 0과 9일때 주의해서 점화식을 세운다. 처음 제출할 때 출력할때만 나머지를 계산해서 출력되도록해서 오버플로우 발생으로 오답이 됐다.
점화식은 자릿수와 바로 앞의 숫자를 인덱스로 모든 경우를 저장한다.
if(앞에 저장된 숫자가 0) dp[i][j] = dp[i - 1][1];
if(앞에 저장된 숫자가 9) dp[i][j] = dp[i - 1][8];
나머지 모든 경우는 dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];

코드

#include <iostream>

#define mod 1000000000

using namespace std;

int N;
long long dp[101][10];

int main() {

    cin >> N;

    dp[1][0] = 0;
    for(int i = 1; i <= 9; i ++) {
        dp[1][i] = 1;
    }

    for(int i = 2; i <= N; i ++) {
        for(int j = 0; j <= 9; j ++) {
            dp[i][j] = 0;

            if(j == 0) {
                dp[i][j] = dp[i - 1][1];
            } else if(j == 9) {
                dp[i][j] = dp[i - 1][8];
            } else {
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
            }

            // 숫자가 너무 커서 오버플로우, 미리 나눈값 저장.
            dp[i][j] %= mod;
        }
    }

    long long ans = 0;
    for(int i = 0; i <= 9; i ++) ans += dp[N][i];

    cout << ans % mod << endl;
    return 0;
}
Share