https://www.acmicpc.net/problem/10844
풀이
1자리 2자리 3자리
뒷자리가 0일때 경우의 수 0개 1개 1개 0뒤에 1
뒷자리가 1일때 경우의 수 1개 1개 3개 1뒤에 0 이나 2
뒷자리가 2일때 경우의 수 1개 2개 3개 2뒤에 1 이나 3
뒷자리가 3일때 경우의 수 1개 2개 4개 3뒤에 2 나 4
뒷자리가 4일때 경우의 수 1개 2개 4개 4뒤에 3 이나 5
뒷자리가 5일때 경우의 수 1개 2개 4개 5뒤에 4 나 6
뒷자리가 6일때 경우의 수 1개 2개 4개 6뒤에 5 나 7
뒷자리가 7일때 경우의 수 1개 2개 4개 7뒤에 6 이나 8
뒷자리가 8일때 경우의 수 1개 2개 3개 8뒤에 7 이나 9
뒷자리가 9일때 경우의 수 1개 1개 2개 9뒤에 8
총 계단수 9 17 32 . . . . .
위의 규칙에 따라 식을 만들게 되면
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; 과 같은 식이 나오게 된다.
단 뒷자리가 0일 경우와 9일 경우는
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; 의 식에서 파란 부분과 빨간 부분의 배열은 존재하지 않기 때문에 예외의 조건식을 작성해주면 된다.
그리고 1000000000으로 나눈 나머지를 출력하면되기 때문에 % 연산을 for문에 넣어준다.
자료형의 범위보다 훨씬 큰 값이 저장되지 않게 나머지를 출력하는 조건을 주어준 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define mod 1000000000 int main() { int total = 0; int dp[101][10] = { 0 }; int arr[10] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; for (int i = 0; i < 10; i++) { dp[1][i] = arr[i]; } int N; scanf("%d", &N); for (int i = 2; i <= N; i++) { for (int j = 0; j < 10; j++) { if (j == 0) { dp[i][j] = dp[i - 1][1] % mod; } else if (j == 9) { dp[i][j] = dp[i - 1][8] % mod; } else dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1])% mod; } for (int i = 0; i < 10; i++) { total = (total+dp[N][i]) % mod; } printf("%d", total % mod); return 0; } | cs |
'알고리즘' 카테고리의 다른 글
(11053)(DP) 백준 가장 긴 증가하는 부분 수열 (0) | 2018.07.14 |
---|---|
(11052)(DP) 백준 붕어빵 판매하기 (0) | 2018.07.14 |
(1912)(DP) 백준 연속합 (0) | 2018.07.12 |
(2156)(DP) 백준 포도주 시식 (0) | 2018.07.12 |
(2579)(DP) 백준 계단오르기 (0) | 2018.07.11 |