알고리즘 :: 백준 :: DP :: 10844 :: 쉬운 계단 수

Embedded June·2020년 7월 22일
0

알고리즘::백준

목록 보기
10/109

문제

45656이란 수를 보자. 이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다. 세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)

문제접근

  1. 1부터 5까지 또 손으로 쓰면서 규칙성/점화식을 찾으려 했다면 아쉽지만 반성해야겠다.
  2. 2차원 메모이제이션을 사용해서 D(n,L)D(n, L)을 길이 n의 계단수를 찾을 때 마지막 수가 L인 경우라고 생각해보자.
  3. ans=for(  1<=i<=9 )  D(n,i)ans = for(\ \ 1 <= i<=9\ )\ \ D(n,i)이다.
  4. 점화식 D(n,L)=D(n1,L1)+D(n1,L+1)D(n,L) = D(n-1,L-1) + D(n-1,L+1)이다.
  5. 이때 기저조건을 잘 생각하자. L=1L=1이라면 다음에 올 수 있는 수는 2밖에 없고, L=9L = 9이라면 다음에 올 수 있는 수는 8밖에 없다.

코드

#include <iostream>
#include <cstring>
using namespace std;

static constexpr int mod = 1000000000;
static long long dp[101][10];
static int N;

int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    cin >> N;
    for (int i = 1; i <= 9; ++i) dp[1][i] = 1;	// 1의 자릿수에 대해 먼저 초기값 정의
    for (int i = 2; i <= N; ++i) {			// 길이 2부터 N까지 DP값으로 계산
        for (int j = 0; j <= 9; ++j) {			// 마지막 숫자가 0~9인 경우
            if (j > 0) dp[i][j] += dp[i - 1][j - 1];
            if (j < 9) dp[i][j] += dp[i - 1][j + 1];	// D[n][L] = D[n-1][L-1] + D[n-1][L+1]
            dp[i][j] %= mod;
        }
    }
    long long ans = 0;
    for (int i = 0; i <= 9; ++i) ans = (ans + dp[N][i]) % mod;
    cout << ans << '\n';
}

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글