반응형
DP를 이용한 문제이다.
이 문제의 기본 점화식은 다음과 같다.
dp[n]= dp[n-1] (1을 더해주는 경우) + dp[n-2] (2를 더해주는 경우) + dp[n-3] (3을 더해주는 경우) , 하지만 이 문제에서는 연속하여 두개이상의 자연수를 사용하면 안되는 조건이 생겼기에 다음과 같이 dp배열을 설계하였다.
dp[n][i] => i의 숫자를 맨마지막 숫자로 가지는 경우
예를 들면 n=3일 경우 dp[3][1]은 2+1 이 있으므로 1, dp[3][2]은 1+2 이 있으므로 1, dp[3][3]은 3이 있으므로 1이 나오게 된다. 이런식으로 최종 점화식을 구하면
dp[n][1] = dp[n-1][2] + dp[n-1][3], 1을 더하는 경우 n-1에서 2와 3으로 끝나는 것에 더할 수 있음.
dp[n][2] = dp[n-2][1] + dp[n-2][3], 2를 더하는 경우 n-2에서 1와 3으로 끝나는 것에 더할 수 있음.
dp[n][3] = dp[n-3][1] + dp[n-3][2], 3을 더하는 경우 n-3에서 1와 2으로 끝나는 것에 더할 수 있음.
위와 같이 풀 수 있다.
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
|
package boj.base;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main_bj_15990_123더하기5 {
public static void main(String[] args) throws Exception {
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
long[][] dp=new long[100001][4];
dp[1][1]=1; dp[1][2]=0; dp[1][3]=0;
dp[2][1]=0; dp[2][2]=1; dp[2][3]=0;
dp[3][1]=1; dp[3][2]=1; dp[3][3]=1;
for(int i=4;i<=100000;i++) {
dp[i][1]=dp[i-1][2]+dp[i-1][3]; dp[i][1]=dp[i][1]%1000000009;
dp[i][2]=dp[i-2][1]+dp[i-2][3]; dp[i][2]=dp[i][2]%1000000009;
dp[i][3]=dp[i-3][1]+dp[i-3][2]; dp[i][3]=dp[i][3]%1000000009;
}
int T=Integer.parseInt(br.readLine());
for(int tc=1;tc<=T;tc++) {
int N=Integer.parseInt(br.readLine());
System.out.println((dp[N][1]+dp[N][2]+dp[N][3])%1000000009);
}
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[BOJ] 6198. 옥상 정원 꾸미기 (0) | 2020.07.24 |
---|---|
[BOJ] 10844. 쉬운 계단 수 (0) | 2020.07.05 |
[BOJ] 11052. 카드 구매하기 (0) | 2020.07.03 |
[BOJ] 11727. 2xn 타일링2 (0) | 2020.07.03 |
[BOJ] 1463. 1로 만들기 (0) | 2020.07.03 |