분류 : DP
https://www.acmicpc.net/problem/15988
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 1,000,000보다 작거나 같다.
진짜 문제 : 정수 n을 1,2,3의 합으로 나타내기
쪼갠 문제 : 현재 정수를 1,2,3의 합으로 나타내기
dp[1] = 1
dp[2] = 2
dp[3] = 3
dp[4]의 경우
여기서 1~4번까지는 dp[3]가 가진 경우의 앞에 1+를 붙여준 경우들이고, 5~6번은 dp[2]가 가진 경우의 앞에 2+를, 7번은 dp[1]가 가진 경우의 앞에 3+를 붙여준 경우다.
여기서 도출할 수 있는 점화식은
dp[i] = dp[i-1]+dp[i-2]+dp[i-3]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class sum123_15988 {
static long[] dp;
public static void solution() throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//테스트케이스 개수
int tc = Integer.parseInt(bf.readLine());
//각 테케 당 n
int[] n = new int[tc];
for(int i=0;i<tc;i++){
n[i] = Integer.parseInt(bf.readLine());
}
//dp 배열 선언
dp = new long[1000001];
//초기값
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
//점화식
for(int i=4;i<=1000000;i++){
dp[i] = (dp[i-1]+dp[i-2]+dp[i-3])%1000000009;
}
//답 출력
for(int i=0;i<tc;i++){
System.out.println(dp[n[i]]);
}
}
}