문제

풀이

#include <iostream>
using namespace std;

int main() {
    int input;
    cin >> input;
    int **arry;
    arry = new int *[input+1];
    int i = 0;
    int r, c;
    int result=0;

    for (i = 0; i <= input; i++)
        arry[i] = new int[10];

    for (i = 0; i < 10; i++) {
        arry[0][i] = 0;
        arry[1][i] = 1;
    }
    arry[1][0] = 0;

    for (i = 0; i <= input; i++)
        arry[i][0] = 0;

    if (input > 1) {

        for (i = 1; i <= 8; i++) {
            arry[2][i] = 2;
        }

        arry[2][9] = 1;

        for (r = 3; r <= input; r++) {
            for (c = 1; c <= 9; c++) {
                if (c - 1 == 0)
                    arry[r][c] = (arry[r - 2][1] + arry[r - 1][2])% 1000000000;
                else if (c + 1 == 10)
                    arry[r][c] =( arry[r - 1][8])% 1000000000;
                else
                    arry[r][c] = (arry[r - 1][c - 1] + arry[r - 1][c + 1])% 1000000000;
            }
        }
    }
    for (c = 0; c <= 9; c++)
        result = (result + arry[input][c])%1000000000;

    cout << result% 1000000000;

    return 0;
}

풀이방법

예를들어 생각해 보자
3자리수를 구하고자 할때
1ㅁㅁ
2ㅁㅁ
3ㅁㅁ
4ㅁㅁ
5ㅁㅁ
6ㅁㅁ
7ㅁㅁ
8ㅁㅁ
9ㅁㅁ
이 나올 수 있다.
이때 ㅁㅁ은
2자리 수에서 구할 수 있다.
즉 여기서 다이나믹 프로그래밍임을 알 수 있다.

다시 예제로 돌아와서.
3ㅁㅁ의 경우 32ㅁ or 34ㅁ이다.
1)즉 D[R][C] = D[R-1][C+1]+D[R-1][C-1]이다. (R은 자릿수, C는 0~9의 수)
2)첫째 자리가 1인 경우는 D[R-2][1]+D[R-1][2]
3)첫째 자리가 9인 경우는 D[R-1][8]만 된다.

1)즉 D[R][C] = D[R-1][C+1]+D[R-1][C-1]이다. (R은 자릿수, C는 0~9의 수)

2)첫째 자리가 1인 경우는 D[R-2][1]+D[R-1][2]

3)첫째 자리가 9인 경우는 D[R-1][8]만 된다.

문제를 풀며 1000000000으로 나누는것을 주의 하자. 생각보다 수가 엄청 커진다

'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글

백준1563 개근상  (0) 2019.01.30
백준11052 카드 구매하기  (0) 2019.01.25
백준 11727 2Xn 타일링 2  (2) 2018.11.07
백준 9095번 1,2,3더하기  (0) 2018.11.07
[백준11726번 - 2xn 타일링]  (0) 2018.11.03

+ Recent posts