https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
bottom-up 방식으로 풀어보았다.
처음에 규칙을 잘못세워서 다른 사람들이 쓴 코드를 참고했다.
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
35
36
37
38
39
40
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static int n;
public static long[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
dp = new long[n + 2][10];
dp[1][0] = 0;
for (int i = 1; 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][j] = dp[i - 1][j + 1] % 1000000000;
} else if (j == 9) {
dp[i][j] = dp[i - 1][j - 1] % 1000000000;
} else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1] % 1000000000;
}
}
}
long count = 0;
for (int i = 0; i < 10; i++) {
count += (dp[n][i]) % 1000000000;
}
System.out.println(count % 1000000000);
}
}
|
cs |
풀면서 잘못 생각한 부분
처음에 생각한 방식은 위 사진처럼 dp[i][j]=dp[i-1][j]+dp[i-2][j]의 점화식을 세우는 것이였다.
![](https://blog.kakaocdn.net/dn/VXvZ2/btra1YRRrt0/DTeruKWuQS0pdWhm1aLpK1/img.png)
하지만 문제점은 1열애 있었다.
그 이유는 중간에 0도 들어갈 수 있다는 것을 생각하지 못했다.
즉, 세로를 기준으로 점화식을 세울 것이 아니라 가로를 기준으로 규칙을 세웠어야 했던 것이다.
그럼 가로를 기준으로 규칙을 세우는 것이 무엇일까?
![](https://blog.kakaocdn.net/dn/dWbkrv/btraRw3QTTT/glfgHNWVDCznmUV9nptb51/img.png)
어차피 1차이 나는 수들의 경우를 구하는 것이기 때문에 열을 기준으로 점화식을 세우는 것이 맞다.
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]이 된다.
하지만 0열과 9열은 예외인데
0열의 경우,
dp[i][0]=dp[i-1][1]
9열의 경우,
dp[i][9]=dp[i-1][8]이다.
왜냐하면 0열이나 9열의 경우 전자는 왼쪽방향에서 오는 경우가 없고(0보다 작은 수는 없음), 후자는 오른쪽에서 오는 경우의 수(9보다 큰 수는 없음)가 없기 때문에 단방향의 점화식만 갖는다.
![](https://blog.kakaocdn.net/dn/bJrFwG/btra6HINZMe/9APzsVo3l5lfMRIA1QTzNK/img.png)
결국 이친수 문제처럼 이번에도 합해지는 규칙을 잘못 짚어서 점화식도 잘못 세우게 된것이였다.
반례를 알고 싶을 때
https://www.acmicpc.net/board/view/60530
글 읽기 - 왜 틀린지 모르겠습니다
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
100을 넣어보면된다!
'알고리즘 > DP' 카테고리의 다른 글
[java 백준] 실버2 /9465번 스티커 (0) | 2021.08.03 |
---|---|
[java 백준] 실버 1/11057번 오르막수 (0) | 2021.08.02 |
[java 백준] 실버3/2193번 이친수 (0) | 2021.08.01 |
[java 백준] 실버 3/ 11727번 2xn타일링 2 (0) | 2021.07.30 |
[java 백준] 실버 3/ 11726번 2 x n 타일링 (0) | 2021.07.28 |
댓글