Algorithm/문제풀이

[다이나믹 프로그래밍] 오르막 수

lee308812 2018. 8. 7. 20:49

문제 링크 : https://www.acmicpc.net/problem/11057


 

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초256 MB102674978394848.240%

문제

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이 때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.

입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.

출력

첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.

예제 입력 1 

1

예제 출력 1 

10

예제 입력 2 

2

예제 출력 2 

55

예제 입력 3 

3

예제 출력 3 

220


[ 문제 풀이 ]


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;
}