티스토리 뷰

문제

https://www.acmicpc.net/problem/11057

풀이과정

쉬운 계단 수 문제와 비슷한 문제이다. D[i][j] = 숫자의 길이가 i이며 마지막 숫자가 j인 수의 오르막 수의 개수라고 정하고 규칙을 찾아봤다.
그 결과로 길이가 i, 마지막 숫자가 j인 숫자의 오르막 수의 개수는 길이가 i-1이고, 마지막 숫자가 j 이하인 숫자들의 오르막 개수를 모두 더하면 됐다.
식으로 나타내보면 아래와 같다.
D[i][j] += D[i-1][k] (0<=k<=j)

소스코드

#include <iostream>
using namespace std;
#define NUM_MAX 10 // 0~9 까지의 수 (10개)
#define mod 10007
int N,ans;
long long D[1001][NUM_MAX]; // D[i][j] = 수의 길이가 i이며 마지막 숫자가 j인 수의 오르막 수의 개수 
int main()
{    
    cin >> N;
    for (int i = 0; i < NUM_MAX; i++) D[1][i] = 1; // 길이가 1인 숫자들의 오르막 수 초기화
    for (int i = 1; i <= N; i++)
    {
        for (int j = 0; j < NUM_MAX; j++)
        {
            for (int k = 0; k <= j; k++)
            {
                // 길이가 i, 마지막 숫자가 j인 수의 오르막 수의 개수는 
                // 길이가 i-1이고 마지막 숫자가 j 이하인 오르막 수의 개수들의 모든 합으로 표현할 수 있다.
                D[i][j] += D[i - 1][k];
                D[i][j] = mod;
            }
        }
    }
    for (int i = 0; i < NUM_MAX; i++) ans += D[N][i];
    cout << ans%mod << "\n";
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 11724번 연결 요소의 개수  (0) 2018.01.03
[백준] 2193번 이친수  (0) 2018.01.03
[백준] 2309번 일곱 난쟁이  (0) 2018.01.02
[백준] 11502번 붕어빵 판매하기  (0) 2017.12.29
[백준] 10844번 쉬운 계단 수  (0) 2017.12.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함