https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
드디어 혼자 힘으로 동적계획법 문제를 풀었다. 처음에는 고민을 해도 문제가 풀리지 않았는데 3학년1학기때 보았던 동적계획법 강의를 조금 보고 Bottom-Up 개념을 다시 확실히하고 문제를 보니 어떤 방식으로 풀어야 할 지 생각이 났다. 먼저 2차원 배열을 통해 문제를 풀어야했는데 행의 크기는 0부터 9까지 10개의 자리를 할당해도 되지만 배열 인덱스오류를 방지하기위해 12개 자리를 할당했다.
열의 크기는 N+1만큼 자리를 주었다. 이 문제를 해결할 때 사용되는 일반적인 경우는 현재 값보다 한 자릿 수가 큰 부분과 1차이가 났을 때 저장했던 값들을 더해주면 해결되었다. 식으로 작성하면
dp[i][j] = dp[i-1][j-1]+dp[i+1][j-1];
하지만 나온결과를 1,000,000,000 으로 나눈 나머지로 구해야 하므로 계산을 할때마다 이 수로 나눈 나머지를 저장했다.
풀이
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
|
package 동적계획법;
import java.io.*;
public class 쉬운계단수 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int flag = 1000000000;
long[][] dp = new long[12][N+1];
dp[0][1] = 0;
for(int i=2;i<=10;i++) //n이 1 인 경우
dp[i][1] = 1;
for(int i=2;i<=N;i++){
for(int j=1;j<=10;j++){ //0부터 9까지 j-1==-1,j+1==9 경우방지를 위해 12자리로 만듬
dp[j][i] = dp[j-1][i-1]%flag +dp[j+1][i-1]%flag;
dp[j][i] %=flag;
}
}
long res = 0;
for(int j=1;j<=10;j++){
res += dp[j][N];
res%=flag;
}
System.out.println(res);
}
}
|
cs |
'IT > 알고리즘' 카테고리의 다른 글
백준11053 가장 긴 증가하는 부분수열 (0) | 2020.05.08 |
---|---|
백준 2156 포도주시식 (0) | 2020.05.05 |
백준2579 계단오르기 (0) | 2020.05.03 |
백준 1149 RGB거리 (0) | 2020.04.28 |
백준 1697 숨바꼭질 자바 (0) | 2020.04.26 |