반응형
https://www.acmicpc.net/problem/12872
본 문제는 수빈이가 플레이리스트를 만들수 있는 경우의 수를 출력하는 문제다.
- 모든 노래를 플레이리스트에 추가해야 하며
- 노래를 중복해서 추가할 수 있다.
- 하지만 중복된 노래를 추가 하려면, 두 곡 사이에 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 == 0) return 1;
// 선택하지 않은 곡이 있을 경우 제외
else return 0;
}
auto &chk = d[len][pick];
if (chk != -1) return 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, -1, sizeof(d));
printf("%lld\n", cal(0, 0));
}
|
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 |
댓글