백준 No.11066 [파일 합치기]
본문 바로가기
Algorithm (C++ based)/BOJ

백준 No.11066 [파일 합치기]

by 조훈이 2021. 2. 7.

Baekjoon Online Judge No.11066 [파일 합치기]


   Problem   

 

11066번: 파일 합치기

소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본

www.acmicpc.net


   Code   

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
68
69
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int INF = 2100000000;
int tc;
vector<int> answer;
vector<int> sum;
 
int cost(int i, int j) {
    if (i > 0return sum[j] - sum[i - 1];
    else return sum[j];
}
 
int DP(vector<int>& chaps) {
    int num = chaps.size();
 
    vector<vector<int>> dp;
    dp.assign(num, vector<int>(num, 0));
 
    // dp[k][k] == 0
 
    for (int i = 1; i < num; i++)
        dp[i - 1][i] = chaps[i] + chaps[i - 1];
    
    for (int j = 2; j < num; j++) {
        for (int i = 0; i < num - j; i++) {
            // (i, i + j)
            int I = i;
            int J = i + j;
            int ans = INF;
 
            for (int k = I; k < J; k++) {
                ans = min(ans, dp[I][k] + dp[k + 1][J] + cost(I, J));
            }
            dp[I][J] = ans;
        }
    }
    return dp[0][num - 1];
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> tc;
 
    while (tc--) {
        int nums;
        cin >> nums;
        
        vector<int> input(nums);
        sum.assign(nums, 0);
 
        for (int i = 0; i < nums; i++) {
            cin >> input[i];
 
            if (i) sum[i] += sum[i - 1+ input[i];
            else sum[i] = input[i];
        }
 
        answer.push_back(DP(input));
    }
 
    for (auto elem : answer) cout << elem << '\n';
}
cs

   How to solve   

  아래 문제와 똑같은 원리로 풀면 된다.

 

백준 No.11049 [행렬 곱셈 순서]

Baekjoon Online Judge No.11049 [행렬 곱셈 순서]  Problem 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연

johoonday.tistory.com

 

728x90

'Algorithm (C++ based) > BOJ' 카테고리의 다른 글

백준 No.13549 [숨바꼭질3]  (0) 2021.02.16
백준 No.1504 [특정한 최단 경로]  (0) 2021.02.09
백준 No.12865 [평범한 배낭]  (0) 2021.02.06
백준 No.10942 [팰린드롬?]  (0) 2021.02.05
BOJ No.2798 [블랙잭]  (0) 2021.02.05

댓글