[백준] 12872 플레이리스트
import java.util.*;
import java.io.*;
public class Main{
// 차례대로 담긴 총 곡 수, 이미 추가된 곡 수 일 때 가능한 경우의 수를 담는 변수
static long[][] d;
static int n, m, p;
static final long mod = 1000000007;
static long go(int idx, int x){
// y 는 아직 플레이 리스트에 담기지 않은 노래의 갯수
int y = n-x;
// idx는 0부터 시작했기 때문에 p이면 이미 다 담긴 것임
if( idx == p ){
// 아직 플레이 리스트에 담기지 않은 노래는 없어야한다
if( y == 0 ) return 1;
// 아직 있다면 불가능한 경우 - 0 반환
else return 0;
}
// 메모된 값이 있다면 갖다 쓰자
if(d[idx][x] != -1){
return d[idx][x];
}
// 모든 경우의 수를 담을 변수
long ans = 0;
// 아직 한번도 안 담긴 곡이 있다면
if( y > 0 ){
// 이 곡을 넣는 모든 경우의 수는 yC1 이므로
ans += go(idx+1, x+1)*y;
}
// 이미 담긴 곡 수가 m개를 초과한다면,
// 끝에서부터 m+1번째 곡~ 첫곡 까지는 한번 더 담겨도 되는거잖아?
if( x > m ){
ans += go(idx+1, x) * (x-m);
}
ans %= mod;
d[idx][x] = ans;
return ans;
}
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
p = Integer.parseInt(st.nextToken());
d = new long[p+1][n+1];
for(int i = 0 ; i <= p ; i++ ){
Arrays.fill(d[i], -1);
}
System.out.println(go(0, 0));
}
}
d 설정 시 어떤게 기준이 되어야 할지가 아직 확실하게 잡히질 않는다
한 30개쯤 더 풀어보자..!
Comments