728x90
쉬운 계단 수
https://www.acmicpc.net/problem/10844
<코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #define mod 1000000000 int main(void){ int N; int Dp[101][10] = {}; int sum = 0; scanf("%d", &N); for (int i = 0; i < 10; i++) Dp[1][i] = 1; for (int i = 2; i <= N; i++){ for (int j = 0; j < 10; j++){ if (j == 0) Dp[i][0] = Dp[i - 1][1] % mod; else if (j == 9) Dp[i][9] = Dp[i - 1][8] % mod; else Dp[i][j] = (Dp[i - 1][j - 1] + Dp[i - 1][j + 1]) % mod; } } for (int i = 1; i < 10; i++) sum = (sum + Dp[N][i]) % mod; printf("%d\n", sum%mod); } | cs |
<문제 푼 요령>
1. 자릿수가 증가함에 따라서 경우의 수도 증가하는데 이 증가할때 법칙이 있다.
2. 이 법칙은 j 자릿수 i 수에 대해서 j-1 자릿수의 i-1과 i+1을 더한 수가 i 수에 대한 값이 되는것이다. 예를들면
- 1 ,2 ,3 ,4 ,5 가 있다고 하면 10 자리수의 쉬운 계단 수를 만들려고 앞의 자리를 1로 결정하는 순간 뒤의 자리수는 0 아니면 2 가 된다.
- 10 ,12, 21, 23, 32, 34 에서 100의 자리수의 쉬운 계단 수를 만들려고하는데 앞자리가 2라면 그 뒤에 10 ,12, 32, 34 의 수가 될 수 있다.
3. 즉 이전 자리수의 앞자리 수의 경우의 수만 알면 지금 자리수에 경우의 수를 구할 수 있게 되는것이다.
4. 이 것을 주욱 반복하면 정답을 구할 수 있다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][2193번][DP] 이친수 (3) | 2016.04.13 |
---|---|
[백준][11057번][DP] 오르막 수 (0) | 2016.04.13 |
[백준][11052번][DP] 붕어빵 (0) | 2016.04.13 |
[백준][11727번][DP] 2xn 타일링 2 (2) | 2016.04.12 |
[백준][11726번][DP] 2xn 타일링 (2) | 2016.04.12 |
댓글