[백준 15990 : JAVA] 1, 2, 3 더하기 5 / DP
문제
풀이
기존의 1, 2, 3 만들기 문제에서 같은 수가 연속해서 오지 못 한다는 조건이 추가되었다.
따라서, 단순히 그 수를 만들기 위한 경우의 수만 저장해가지곤 점화식을 끄집어낼 수 없다.
두 가지 정보가 필요하다.
- N을 만들기 위한 경우의 수인데,
- 그 수식의 마지막이 어떤 수로 끝나는 것들.
7을 1, 2, 3의 합으로 나타내는 경우의 수를 살펴보자.
1) 7을 만드는 수식 중 마지막이 1로 끝나는 것의 수
6을 만드는 수식 중 마지막이 2로 끝나는 것 + 1
6을 만드는 수식 중 마지막이 3로 끝나는 것 + 1
DP[7][1] = DP[6][2] + DP[6][3]
2) 7을 만드는 수식 중 마지막이 2로 끝나는 것의 수
5를 만드는 수식 중 마지막이 1로 끝나는 것 + 2
5를 만드는 수식 중 마지막이 3로 끝나는 것 + 2
DP[7][2] = DP[5][1] + DP[5][3]
3) 7을 만드는 수식 중 마지막이 3로 끝나는 것의 수
4를 만드는 수식 중 마지막이 1로 끝나는 것 + 3
4를 만드는 수식 중 마지막이 2로 끝나는 것 + 3
DP[7][3] = DP[4][1] + DP[4][2]
위 세 경우를 일반화하면 다음의 점화식이 나온다.
DP[N][1] = DP[N - 1][2] + DP[N - 1][3]
DP[N][2] = DP[N - 2][1] + DP[N - 2][3]
DP[N][3] = DP[N - 3][1] + DP[N - 3][2]
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final int MOD = 1_000_000_009;
private static int T, N;
private static long[][] cache;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
cache = new long[100_001][4];
cache[1][1] = 1;
cache[2][2] = 1;
cache[3][1] = 1;
cache[3][2] = 1;
cache[3][3] = 1;
for (int i = 4; i <= 100_000; i++) {
cache[i][1] = (cache[i - 1][2] + cache[i - 1][3]) % MOD;
cache[i][2] = (cache[i - 2][1] + cache[i - 2][3]) % MOD;
cache[i][3] = (cache[i - 3][1] + cache[i - 3][2]) % MOD;
}
T = Integer.parseInt(br.readLine());
while (T-- > 0) {
N = Integer.parseInt(br.readLine());
long result = (cache[N][1] + cache[N][2] + cache[N][3]) % MOD;
sb.append(result).append("\n");
}
System.out.println(sb.toString());
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 2437 : JAVA] 저울 / 그리디 (0) | 2021.08.02 |
---|---|
[백준 2240 : JAVA] 자두나무 / DP (1) | 2021.04.22 |
[백준 9084 : JAVA] 동전 / DP (0) | 2021.04.20 |
[백준 2302 : JAVA] 극장 좌석 / DP (2) | 2021.04.18 |
[백준 10164 : JAVA] 격자상의 경로 / DFS + DP (0) | 2021.04.17 |
댓글
이 글 공유하기
다른 글
-
[백준 2437 : JAVA] 저울 / 그리디
[백준 2437 : JAVA] 저울 / 그리디
2021.08.02 -
[백준 2240 : JAVA] 자두나무 / DP
[백준 2240 : JAVA] 자두나무 / DP
2021.04.22 -
[백준 9084 : JAVA] 동전 / DP
[백준 9084 : JAVA] 동전 / DP
2021.04.20 -
[백준 2302 : JAVA] 극장 좌석 / DP
[백준 2302 : JAVA] 극장 좌석 / DP
2021.04.18