문제
45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
구현
- 1 2 3 4 5 6 7 8 9
- 10 12 21 23 32 34 43 45 54 56 ....
- 끝자리에 1개씩 더하는 것과 같음
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define _CRT_SECURE_NO_WARNINGS
long DP[101][11]; //100까지 받을수 있고 0~9 까지 10개 이므로 100*10 2차원배열 설정
int compare(int a, int b) {
return (a <= b) ? a : b;
}
int main(void) {
int num, i;
long sum;
scanf("%d", &num);
for (i = 1; i <= 9; i++) { //입력 받은 수가 1자리 일 경우 DP의 첫 배열은 1로 초기화
DP[1][i] = 1;
}
for (i = 2; i <= num; i++) { //입력 받은 수가 2자리 이상 일 경우
DP[i][0] = DP[i - 1][1]; //끝자리가 0인 경우는 이전 DP배열의 1번째와 같음 0은 1로부터만 옴
for (int j = 1; j <= 9; j++) { // 끝자리가 1~9인 경우 이전 DP배열의 양옆의 합과 같음
DP[i][j] = (DP[i - 1][j - 1] + DP[i - 1][j + 1]) % 1000000000;
}
}
sum = 0;
for (i = 0; i < 10; i++) { //최종 DP배열의 각 자리수 합
sum += DP[num][i];
}
printf("%d\n", sum % 1000000000);
return 0;
}
'Algorithm > DP' 카테고리의 다른 글
11053번 가장 긴 증가하는 부분수열 BOJ 백준 C언어 (0) | 2020.08.24 |
---|---|
2156번 포도주 시식 BOJ 백준 C언어 (0) | 2020.08.07 |
1463번 1로 만들기 BOJ 백준 C언어 (0) | 2020.08.06 |
2579번 계단 오르기 BOJ 백준 C언어 (0) | 2020.08.06 |
1932번 정수 삼각형 BOJ 백준 C언어 (0) | 2020.08.05 |
댓글