백준/DP
[백준] 1, 2, 3 더하기 9 (16195번 JAVA)
MoveForward
2023. 1. 15. 13:42
[백준] 1, 2, 3 더하기 9 (16195번 JAVA)
[접근 방법]
15992번 [1, 2, 3 더하기 7] 문제와 아주 유사한 문제이다.
이전에는 각 수식이 몇개의 숫자로 이루어졌는지를 구해야했다면, 이번에는 몇개 이하의 수식 개수를 모두 더하면 된다.
15992번 [1, 2, 3 더하기 7] 문제 풀이는 다음과 같다.
https://notorious.tistory.com/176
[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 7 (15992번 JAVA)
[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 7 (15992번 JAVA) [접근 방법] 2차원 배열로 dp를 선언해야 한다. dp[n][m] = dp[수식의 합][수식의 수 개수] 로 정의한다. long[][] dp = new long[1_001][1_001]; dp[1
notorious.tistory.com
전반적인 풀이는 동일하고 마지막에 result 변수를 선언하여 m 이하의 수를 사용한 경우를 모두 더해주었다.
[JAVA 코드]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
long[][] dp = new long[1_001][1_001];
dp[1][1] = 1; // 1
dp[2][1] = 1; // 2
dp[2][2] = 1; // 1+1
dp[3][1] = 1; // 3
dp[3][2] = 2; // 1+2, 2+1
dp[3][3] = 1; // 1+1+1
// 정수 i가 j개의 수로 이루어진 경우의 수 구하기
for(int i=4; i<=1_000; i++){
for(int j=1; j<=i; j++){
dp[i][j] = (dp[i-1][j-1] + dp[i-2][j-1] + dp[i-3][j-1]) % 1_000_000_009;
}
}
for(int i=0; i<T; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// m 개 이하의 수를 사용한 경우의 수를 모두 더해준다.
long result = 0;
for(int k=1; k<=m; k++){
result += dp[n][k];
}
bw.write(result % 1_000_000_009 + "\n");
}
bw.flush();
bw.close();
}
}