풀이
우선 본 문제의 아이디어는 쉬운 계단 수에서 가져왔다.
굉장히 유사한 방법(거의 똑같다)으로 풀 수 있었다.
D[i][j]는 길이가 i이고 끝자리 숫자가 j인 오르막 수
따라서 i - 1 길이, 끝자리 숫자가 현재 j보다 작은 오르막 수들의 경우의 수를 누적 시키면 된다.
코드
#include <cstdio>
int n, D[1001][10];
const int div = 10007;
int main()
{
scanf("%d", &n);
for (int i = 0; i <= 9; ++i)
D[1][i] = 1;
for (int i = 2; i <= n; ++i)
for (int j = 0; j <= 9; ++j)
for (int k = 0; k <= 9; ++k)
if (j - k >= 0)
{
D[i][j] += D[i - 1][j - k];
D[i][j] %= div;
}
int sum = 0;
for (int i = 0; i <= 9; ++i)
sum += D[n][i] % div;
printf("%d\n", sum % div);
return 0;
}
'온라인저지' 카테고리의 다른 글
[BOJ] 2607번: 비슷한 단어 (0) | 2018.07.12 |
---|---|
[BOJ] 11048번: 이동하기 (0) | 2018.06.04 |
[BOJ] 1932번: 정수 삼각형 (0) | 2018.06.04 |
[BOJ] 1010번: 다리 놓기 (0) | 2018.06.03 |
[BOJ] 2163번: 초콜릿 자르기 (0) | 2018.06.02 |
[BOJ] 5622번: 다이얼 (0) | 2018.06.02 |
댓글