https://www.acmicpc.net/problem/2482
풀이 :
N개의 색상환을 입력받았을 때 K 개를 선택할 수 있는 경우의 수를 구하는 문제
dp[i][j] = i 개의 색상환에서 j 개를 선택할 경우의 수
여기서 j 를 선택하는 경우와 선택하지 않는 경우로 나눌 수 있다.
j 번째를 선택하는 경우
= dp[i-2][j-1]
j 번째를 선택하지 않는 경우
= dp[i-1][j]
dp[i][j] = dp[i-2][j-1] + dp[i-1][j]
단 마지막에서
N 개의 색상환이 주어졌을 때
N-1, 1번째 색상환을 모두 배재해야하므로 N-3 으로 구해야한다.
dp[N][K] = dp[N-3][K-1] + dp[N-1][K]
초기화는 1 ~ N개의 색상환이 주어졌을 때 1개만 선택하는 경우 1 ~ N 개의 값을 가진다.
K가 1일 경우 K-1이 성립되지 않으므로 따로 구해줬다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int K;
static int dp[][];
static int MOD = 1000000003;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
K = Integer.parseInt(br.readLine());
dp = new int[N+1][K+1];
/*
dp[i][j] = i 개의 색상환 중에서 j 개를 선택했을 때의 경우의 수
j 번째를 칠했을 경우 = dp[i-2][j-1]
안칠했을 경우 = dp[i-1][j]
*/
for(int i = 1; i<=N; i++) {
dp[i][1] = i;
}
for(int i = 2; i<=N; i++) {
for(int j = 2; j<=K; j++) {
dp[i][j] = (dp[i-2][j-1] + dp[i-1][j]) % MOD;
}
}
int result = (dp[N-3][K-1] + dp[N-1][K]) % MOD;
if (K == 1) {
result = N % MOD;
}
System.out.println(result);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[BaekJoon] 백준 1240. 노드사이의 거리 (0) | 2022.09.27 |
---|---|
[BaekJoon] 백준 12868번. 돌 그룹 (0) | 2022.09.16 |
[BaekJoon] 17404번: RGB거리 2 (0) | 2022.09.13 |
[BaekJoon] 백준 11049번 행렬 곱셈 순서(Java) (0) | 2022.09.13 |
[BaekJoon] 백준 11404번: 플로이드 (0) | 2022.09.06 |