수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 11066 파일합치기 본문

알고리즘/C++

[C++] BAEKJOON 11066 파일합치기

ssung.k 2019. 9. 7. 22:40

https://www.acmicpc.net/problem/11066

 

11066번: 파일 합치기

문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을

www.acmicpc.net

동적계획법을 사용하여 문제를 해결하였습니다 . 그 중에서도 top-down 방식입니다.

dp[i][j]i 부터 j 까지의 파일을 합치는 최소 비용 으로 정의했습니다.

파일의 사이즈를 중복해서 더해줘야 하므로 sum 배열을 만들어 구간까지의 파일의 합을 한 번에 더해 줄 수 있게 하였습니다.

#include <iostream>
#include <cstring>

using namespace std;

int file[501];
int sum[501];
int dp[501][501];

int go (int i,int j){
    if (i==j) return 0;
    if (dp[i][j] != -1) return dp[i][j];
    
    for (int k=i;k<j;k++){
        int temp = go(i,k) + go(k+1,j) + sum[j] - sum[i-1];
        if (dp[i][j] == -1 || dp[i][j] > temp)
            dp[i][j] = temp;
    }
    return dp[i][j];
}

int main(){
    int T;
    cin >> T;
    for (int t=0;t<T;t++){
        memset(dp,-1,sizeof(dp));
        memset(sum,0,sizeof(sum));
        
        int N;
        cin >> N;
        
        for (int i=1;i<=N;i++){
            cin >> file[i];
            sum[i] = sum[i-1] + file[i];
        }
        
        cout << go(1,N) <<"\n";
    }
    return 0;
}

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

[C++] BAEKJOON 1629 곱셈  (0) 2019.09.08
[C++] BAEKJOON 11049 행렬 곱셈 순서  (0) 2019.09.08
[C++] BAEKJOON 1520 내리막길  (0) 2019.09.07
[C++] BAEKJOON 2293 동전 1  (0) 2019.09.06
[C++] BAEKJOON 2156 포도주 시식  (0) 2019.09.06
Comments