본문 바로가기
알고리즘/DP

2302 극장 좌석

by tryotto 2020. 2. 28.
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
#include <stdio.h>
 
int main() {
    int total, n;
    scanf("%d %d"&total, &n);
 
    int len_num[50= { 0 }, bef = 1;
    while (n--) {
        int cur;
        scanf("%d"&cur);
 
        int len = cur - bef;
        len_num[len]++;
 
        bef = cur+1;
    }
    len_num[total - bef + 1]++;
 
    int maxV = -1;
    for(int i=40;i>0;i--)
        if (len_num[i] > 0) {
            maxV = i;
            break;
        }
    
    int dp[50= { 0 };
    dp[1= 1;
    dp[2= 2;
    for (int i = 3; i <= maxV; i++
        dp[i] = dp[i - 1+ dp[i - 2];
    
    int rst = 1;
    for (int i = maxV; i > 0; i--) {
        int num = len_num[i];
 
        for (int j = 1; j <= num; j++) {
            rst *= dp[i];
        }
    }
 
    printf("%d", rst);
}
cs

1. 각 좌석을 vip 석을 기준으로 얼만큼의 간격이 있는지 먼저 구한다
2. 각 좌석의 간격 길이에 대응되는 DP 값을 구한다
> dp[i] = i 번째 좌석에 그대로 앉는 경우 + (i-1)번째 좌석에 그대로 앉는 경우
3. 각 간격의 DP 값들을 서로 곱해준다


'알고리즘 > DP' 카테고리의 다른 글

2240 자두나무  (0) 2020.02.28
7579 앱  (0) 2020.02.28
11066 파일합치기  (0) 2020.02.28
11052 카드 구매하기  (0) 2020.02.27
DP정리> 동전 문제  (0) 2020.01.12