백준 17271번 – 리그 오브 레전설 (Small)
🔗 리그오브 레전설
규환이는 리그 오브 레전설이라는 게임을 좋아한다.
이 게임에서는 N초의 시간 동안 싸움을 하는데, 규환이가 플레이하는 캐릭터는 A, B 두 가지 스킬을 사용할 수 있다.
규환이는 다양한 스킬 조합을 원하기 때문에, 가능한 모든 스킬 조합의 개수를 알고 싶어 한다.
단, 스킬을 시전하는 동안에는 다른 스킬을 사용할 수 없으며, 빈 시간 없이 총 시간이 딱 N초가 되어야 한다.
예를 들어, N = 4, M = 2이면 가능한 스킬 조합은
AAAA, AAB, ABA, BAA, BB
총 5가지이다.
입력
첫 번째 줄에 두 정수 N, M이 주어진다.
출력
가능한 스킬 조합의 개수를 1,000,000,007로 나눈 나머지를 출력한다.
4 2
5
DP 정의
dp[i] = 총 시간이 i초일 때 가능한 스킬 조합의 수 (MOD 적용)
초기값
dp[0] = 1 (아무 스킬도 쓰지 않은 상태 하나)점화식
dp[i-1] i >= M인 경우에만 dp[i-M] dp[i] = dp[i-1];
if (i >= M) {
dp[i] = (dp[i] + dp[i-M]) % MOD;
}
import java.io.*;
import java.util.*;
public class Main {
static final int MOD = 1_000_000_007;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] dp = new int[N+1];
dp[0] = 1;
for (int i = 1; i <= N; i++) {
dp[i] = dp[i-1]; // 마지막에 A 스킬
if (i >= M) {
dp[i] = (dp[i] + dp[i-M]) % MOD; // 마지막에 B 스킬
}
}
System.out.println(dp[N]);
}
}
dp[0] = 1로 두어, B 스킬로 시작하거나 A 스킬로만 채우는 경우 모두 자연스럽게 포함할 수 있다.