๋ฐฑ์ค€/Gold

[BOJ] 11066 : ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

Jaeguk 2022. 2. 7. 23:17
๋ฌธ์ œ ๋งํฌ

11066๋ฒˆ: ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ (acmicpc.net)

 

11066๋ฒˆ: ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

์†Œ์„ค๊ฐ€์ธ ๊น€๋Œ€์ „์€ ์†Œ์„ค์„ ์—ฌ๋Ÿฌ ์žฅ(chapter)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์“ฐ๋Š”๋ฐ, ๊ฐ ์žฅ์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณค ํ•œ๋‹ค. ์†Œ์„ค์˜ ๋ชจ๋“  ์žฅ์„ ์“ฐ๊ณ  ๋‚˜์„œ๋Š” ๊ฐ ์žฅ์ด ์“ฐ์—ฌ์ง„ ํŒŒ์ผ์„ ํ•ฉ์ณ์„œ ์ตœ์ข…์ ์œผ๋กœ ์†Œ์„ค์˜ ์™„์„ฑ๋ณธ

www.acmicpc.net

ํ’€์ด

๋ชจ๋“  ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ.

๋™์ ๊ณ„ํš๋ฒ•(Dynamic programming)์„ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•œ DP๋ฅผ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค.

DP[i][j] ๋ฐฐ์—ด์— i๋ถ€ํ„ฐ j๋ฒˆ์งธ ๊นŒ์ง€์˜ ํŒŒ์ผ์„ ํ•ฉ์น˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ์„ ์ €์žฅํ•œ๋‹ค.

์ฆ‰ DP[i][j] = Min(i <= K <= j)DP[i][K] + DP[K+1] + Sum[i to j] (์ด๊ฑด ๊ณ ์ •์ง€์ถœ)

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด 40 30 30 50 ์ด๋‹ค DP[i][i] ๋Š” ๋ชจ๋‘ 0์ด ์ €์žฅ๋˜์–ด ์žˆ๊ณ 

DP[1][2] = 70, DP[2][3] = 60, DP[3][4] = 50 ์ด ํ• ๋‹น๋œ๋‹ค.

DP[1][3]์—๋Š” DP[1][1] + DP[2][3] , DP[1][2] + DP[3][3] ์ค‘ ์ตœ์†Œ๊ฐ’๊ณผ Sum[1 ~ 3]์„ ๋”ํ•œ ๊ฐ’์ด ์ €์žฅ๋˜์–ด์•ผํ•œ๋‹ค.

 

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef priority_queue <pair<pair<intint>int>vector<pair<pair<intint>int>>, greater<pair<pair<intint>int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 500 + 5;
int K;
int T;
int dp[MAX_N][MAX_N];
int File[MAX_N];
ll Sum[MAX_N];
void Init() {
    for (int i = 0; i < MAX_N; i++) {
        for (int j = 0; j < MAX_N; j++) {
            dp[i][j] = 0;
        }
    }
    memset(File, 0sizeof(File));
    memset(Sum, 0sizeof(Sum));
}
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while (T--) {
        cin >> K;
        Init();
        for (int i = 1; i <= K; i++) {
            cin >> File[i];
            Sum[i] += Sum[i - 1+ File[i];
        }
        for (int i = 1; i < K; i++) { // ๋ฒ”์œ„์˜ ๊ธธ์ด
            for (int j = 1; j <= K - i; j++) { //์‹œ์ž‘์ 
                int Min = INF;
                for (int k = 0; k < i; k++) {
                    Min = min(Min, dp[j][j + k] + dp[j+k+1][j + i]);
                }
                dp[j][j + i] =  Min + (Sum[j + i] - Sum[j - 1]);
            }
        }
        cout << dp[1][K] << "\n";
    }
    return 0;
}
cs

๊ตฌํ˜„๋งŒ ์ž˜ ํ•ด์ค€๋‹ค๋ฉด AC๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

728x90