기술 블로그

1952번 수영장 본문

알고리즘 문제/SW Expert Academy

1952번 수영장

parkit 2018. 8. 27. 08:46
728x90
반응형

백트래킹, 다이나믹 프로그래밍 문제다.




문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq#none




<정답 코드 : 백트래킹>

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
 
using namespace std;
 
int usable[12= { 0, };
 
int price[4= { 0, };
 
int ans = 987654321;
 
void DFS(int month, int cost)
{
    if (month >= 12)
    {
        ans = min(ans, cost);
        return;
    }
 
    // 1일
    DFS(month + 1, cost + price[0* usable[month]);
    
    // 1달
    DFS(month + 1, cost + price[1]);
    
    // 3개월
    DFS(month + 3, cost + price[2]);
 
    // 1년
    DFS(month + 12, price[3]);
}
 
int main(void)
{
    int T = 0;
 
    scanf("%d"&T);
 
    for (int tc = 1; tc <= T; tc++)
    {
        memset(usable, 0sizeof(usable));
 
        for (int i = 0; i < 4; i++)
        {
            scanf("%d"&price[i]);
        }
 
        for (int i = 0; i < 12; i++)
        {
            scanf("%d"&usable[i]);
        }
 
        DFS(00);
 
        printf("#%d %d\n", tc, ans);
 
        ans = 987654321;
    }
 
    return 0;
}
cs






<정답 코드 : 다이나믹 프로그래밍>

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
49
50
51
52
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
 
using namespace std;
 
int C[5= { 0, };
int U[13= { 0, };
int dp[13= { 0, };
 
int main(void)
{
    int T = 0;
 
    scanf("%d"&T);
 
    for (int tc = 1; tc <= T; tc++)
    {
        for (int i = 1; i <= 4; i++)
        {
            scanf("%d"&C[i]);
        }
 
        for (int i = 1; i <= 12; i++)
        {
            scanf("%d"&U[i]);
        }
 
        for (int i = 1; i <= 12; i++)
        {
            int ret = 987654321;
 
            ret = min(ret, dp[i - 1+ C[1* U[i]);
            ret = min(ret, dp[i - 1+ C[2]);
 
            if (i >= 3) ret = min(ret, dp[i - 3+ C[3]);
            
            dp[i] = ret;
        }
 
        int ans = min(dp[12], C[4]);
 
        printf("#%d %d\n", tc, ans);
    }
 
    return 0;
}
cs





728x90
반응형

'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글

2105번 디저트 카페  (0) 2018.08.31
2382번 미생물 격리  (0) 2018.08.29
1953번 탈주범 검거  (0) 2018.08.25
2383번 점심 식사시간  (0) 2018.08.25
1267번 작업순서  (0) 2018.08.25