본문 바로가기
백준

[백준 12872] 플레이리스트, C++

by 황인태(intaehwang) 2020. 4. 27.
반응형

https://www.acmicpc.net/problem/12872

 

12872번: 플레이리스트

첫째 줄에 수빈이가 만들 수 있는 플레이리스트의 경우의 수를 출력한다. 경우의 수가 매우 커질 수 있기 때문에, 1,000,000,007로 나눈 나머지를 출력한다.

www.acmicpc.net

본 문제는 수빈이가 플레이리스트를 만들수 있는 경우의 수를 출력하는 문제다.

  1. 모든 노래를 플레이리스트에 추가해야 하며
  2. 노래를 중복해서 추가할 수 있다.
  3. 하지만 중복된 노래를 추가 하려면, 두 곡 사이에 m개 이상의 곡이 있어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <cstdio>
#include <cstring>
 
using namespace std;
 
long long d[101][101];
int n, m, p;
 
// len : 플레이리스트 길이
// pick : 노래를 선택한 개수
long long cal(int len, int pick) {
 
    // sur : 선택하지 않은 곡의 수
    int sur = n - pick;
 
    // 플레이리스트 길이가 수빈이가 들으려고 하는 곡 수 일 때
    if (len == p) {
 
        // 선택하지 않은 곡이 없을 경우
        if (sur == 0return 1;
 
        // 선택하지 않은 곡이 있을 경우 제외
        else return 0;
    }
 
    auto &chk = d[len][pick];
    if (chk != -1return chk;
 
    chk = 0;
 
    // 아직 선택하지 않은 곡이 있을 경우
    if (sur > 0) chk += cal(len+1, pick+1)*sur;
 
    // 선택한 곡이 m개를 넘을 경우
    // 이전에 선택한 곡을 추가해도 된다.
    if (pick > m) chk += cal(len+1, pick)*(pick-m);
 
    chk %= 1000000007;
 
    return chk;
}
 
int main () {
    scanf("%d %d %d"&n, &m, &p);
 
    memset(d, -1sizeof(d));
    printf("%lld\n", cal(00));
}
cs

 

반응형

'백준' 카테고리의 다른 글

[백준 3190] 뱀, C++  (0) 2020.05.11
[백준 14888] 연산자 끼워넣기, C++  (0) 2020.05.03
[백준 2916] 자와 각도기, C++  (1) 2020.04.27
[백준 17069] 파이프 옮기기 2, C++  (0) 2020.04.22
[백준 17070] 파이프 옮기기 1, C++  (0) 2020.04.22
Buy me a coffeeBuy me a coffee

댓글