10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
출력 조건에서 값이 매우 크기 때문에 브루트 포스로는 할 수 없다는 것을 알았고, 이전 자리까지의 수가 다음 자리의 수를 결정하기 때문에 DP라는 것을 유추할 수 있었다.
N자리 수에서 0, 1, 2, 3, 4, 5, 6, 7, 8, 9가 맨 끝에 몇 개 올 수 있는지에 대하여 DP 배열을 구성했다.
주의할 점은 0은 1번째자리에서 존재할 수 없고, 이전 수는 오직 1뿐만이 가능하다. 9는 8뿐만이 가능하다. 0과 9는 서로 계단 수가 아니다.
나머지 수는 자신보다 큰 값이나 작은 값 다음에 올 수 있다.
*시도는 안해봤지만 자료형을 int로 하거나 매 과정에서 mod연산을 취해주지 않으면 답이 틀릴 수도 있다.
import java.io.*; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); long[][] dp = new long[10][N+1]; for (int i = 1; i < 10; i++) { dp[i][1] = 1; } for (int i = 2; i <= N; i++) { for (int j = 0; j < 10; j++) { if(j == 0) { dp[j][i] = dp[1][i-1] % 1000000000; } else if(j == 9) { dp[j][i] = dp[8][i-1] % 1000000000; } else { dp[j][i] = (dp[j-1][i-1] % 1000000000 + dp[j+1][i-1] % 1000000000) % 1000000000; } } } long res = 0; for (int i = 0; i < 10; i++) { res += dp[i][N] % 1000000000; } System.out.println(res % 1000000000); } }
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[Java] BOJ1107_리모컨 (0) | 2021.04.16 |
---|---|
[Java] BOJ11053_가장 긴 증가하는 부분 수열 (0) | 2021.04.16 |
[Java] BOJ10836_여왕벌 (0) | 2021.04.15 |
[Java] BOJ1074_Z (0) | 2021.04.15 |
[Java] BOJ1068_트리 (0) | 2021.04.15 |