[백준] 11066: 파일 합치기 - JAVA

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

풀이

파일을 1번부터 K번까지 합쳐야하는데 합치는 순서를 다르게 하여 최소 비용을 구해야 한다.

각 파일마다 비용을 입력받으면서 누적합으로 저장을 했다.(sum[5]는 1~5까지의 누적합)

dp배열을 만들어 저장을 하는데 dp[x][y]는 x~y까지 파일을 합치는 최소 비용을 갱신하며 저장한다.

x와 y의 차이를 gap으로 하여 gap을 1부터 늘려가면서 계산한다.

gap안에서 x와 y의 사이값d를 잡아 x~d, d+1~y의 합과 누적합배열에서 x~y를 찾아 최소비용을 갱신한다.

1~K를 나타내는 dp[1][K]가 답이된다.


메모리: 32180KB

시간: 552ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for (int tc = 0; tc < T; tc++) {
            int K = Integer.parseInt(br.readLine());

            int[] sum = new int[K + 1];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 1; i < K + 1; i++) {
                sum[i] = sum[i - 1] + Integer.parseInt(st.nextToken());
            }

            int[][] dp = new int[K + 1][K + 1];
            for (int gap = 1; gap < K; gap++) {
                for (int i = 1; i <= K - gap; i++) {
                    int j = i + gap;
                    dp[i][j] = Integer.MAX_VALUE;

                    for (int d = i; d < j; d++) {
                        dp[i][j] = Math.min(dp[i][j], dp[i][d] + dp[d + 1][j] + sum[j] - sum[i - 1]);
                    }
                }
            }

            sb.append(dp[1][K]).append("\n");
        }

        System.out.println(sb);
    }

}