tags:
[! Todo] Title
https://www.acmicpc.net/problem/9095
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
package run;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int solution(int n){
if(n <= 3){
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
if(n == 3){
return 4;
}
}
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <=n; i++) {
int sum = 0;
for (int j = i-3; j < i; j++) {
sum += dp[j];
}
dp[i] = sum;
}
return dp[n];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int[] answer = new int[t];
for (int i = 0; i < t; i++) {
answer[i] = solution(Integer.parseInt(br.readLine()));
}
for (int i = 0; i < t; i++) {
System.out.println(answer[i]);
}
}
}
전형적인 다이나믹 프로그래밍 문제이다.
더할 수 있는 수는 총 1,2,3 뿐이다 따라서 핵심 아이디어는 메모에제이션한 모든 가지수를 현재
i -1, i-2, i-3 을 모두 더해서 i 의 값을 만들어주는 것이 핵심이다
예를 들어서 4는 3 +1, 2+2, 1 +3 으로 나눌수 있기 때문에 점화식은 다음과 같다
dp[4] = dp[3] + dp[2] + dp[1];