문제 링크 : https://www.acmicpc.net/problem/11057
오르막 수 성공
문제오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이 때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다. 입력첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다. 출력첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다. 예제 입력 11 예제 출력 110 예제 입력 22 예제 출력 255 예제 입력 33 예제 출력 3220 |
[ 문제 풀이 ]
D[i][j] = 마지막 수가 j로 끝나는, i자리 오르막 수의 개수
만약 N자리수에서 마지막수가 5로 끝난다면, N-1번째 자리수에 올 수 있는 수는 1~5이다.
문제에서, 0으로 시작하는 수도 있을 수 있다고 했으므로, 아래와 같이 나타낼 수 있다.
[ 최종 구현(C++) ]
#include <stdio.h> #define MAX_NUMBER 1002 int D[MAX_NUMBER][10] = { 0, }; int main(void) { int N; int result = 0; scanf("%d", &N); for (int j = 0; j < 10; j++) D[1][j] = 1; for (register int i = 2; i <= N; i++) { int sum = 0; for (register int j = 0; j < 10; j++) { sum = (sum + D[i - 1][j]) % 10007; D[i][j] = sum; } } for (register int j = 0; j < 10; j++) result = (result + D[N][j]) % 10007; printf("%d\n", result); return 0; }
'Algorithm > 문제풀이' 카테고리의 다른 글
[다이나믹 프로그래밍] 포도주 시식 (0) | 2018.08.10 |
---|---|
[다이나믹 프로그래밍] 스티커 (0) | 2018.08.07 |
[다이나믹 프로그래밍] 이친수 (0) | 2018.08.07 |
[주의][다이나믹 프로그래밍] 쉬운 계단 수 (0) | 2018.08.05 |
[다이나믹 프로그래밍] 붕어빵 판매하기 (0) | 2018.08.04 |