다이나믹 프로그래밍을 이용해서 푸는 문제 자리 수가 i이고 자리 수의 마지막 수가 j라고 하면 d[i][j] 라는 식으로 표현하고

이는 d[i][j] += d[i -1][k] (0 <= k<= j) 점화식으로 확장 될 수 있다. 잘 생각해보면 예를들어 마지막 수가 8이면 마지막 수가 0부터 8까지 전 자리 수의 개수를 더해주면 된다. 3중 for문이라 좀 당황했는데 n에 따라 변하지는 않으므로 복잡도는 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
#include <iostream>
using namespace std;
int input = 0;
long long d[1050][15];
int main()
{
    cin >> input;
    for(int i = 0;i < 10++i)
        d[1][i] = 1;
    for(int i = 2; i <= input; ++i)
    {
        for(int j = 0;j <= 9++j)
        {
            for(int k = 0;k <= j; ++k)
            {
                d[i][j] += d[i - 1][k];
                d[i][j] %= 10007;
            }
        }
    }
    long long ans = 0;
    for(int i = 0;i < 10++i)
    {
        ans += d[input][i];
        ans %= 10007;
    }
    cout << ans;
    return 0;
}
cs


'백준 온라인 저지' 카테고리의 다른 글

백준 11053: 가장 긴 증가하는 부분 순열  (0) 2018.07.09
백준 2156: 포도주 시식  (0) 2018.07.09
백준 9465: 스티커  (0) 2018.07.09
백준 2193: 이친수  (0) 2018.07.09
백준 10799: 쇠막대기  (0) 2018.07.09

+ Recent posts