파게로그

[백준 11066번] 파일 합치기 본문

콤퓨타 왕왕기초/PS

[백준 11066번] 파일 합치기

파게 2020. 12. 18. 02:52

문제 링크: 11066번 제목

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

 

앞서 행렬의 곱 문제와 유사하다. 부분 문제의 해를 2차원 배열에 저장한다. 다만 여기서는 한 개짜리 파일을 두 개 합칠 때와 그렇지 않을 때의 계산 과정이 달라진다.

 

merge_cost(A, B) = A.size + B.size
merge_cost(AB, C) = merge_cost(A, B) + merge_cost(C) + size(AB) + size(C)

 

이를 고려하여 dp[i][1]과 dp[i][2]를 모두 미리 채운 후 dp 배열을 채워나간다.

 

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    static int[] partialSum;
    
    public static int size(int i, int j) {
        return partialSum[i] - partialSum[i-j];
    }

    public static void solution(int[] arr, int n) {
        // create partialSum
        partialSum = Arrays.copyOf(arr, n+1);
        for (int i = 2; i <= n; i++)
            partialSum[i] += partialSum[i-1];

        // create dp
        int[][] dp = new int[n+1][n+1];

        for (int i = 2; i <= n; i++)
            dp[i][2] = size(i, 2);

        for (int i = 3; i <= n; i++) {
            for (int j = 3; j <= i; j++) {
                ArrayList<Integer> list = new ArrayList<>();
                int min = Integer.MAX_VALUE;
                for (int t = 1; t <= j-1; t++) {
                    int cur = dp[i-j+t][t] + dp[i][j-t];
                    if (cur < min)
                        min = cur;
                }
                dp[i][j] = min + size(i, j);
            }
        }

        System.out.println(dp[n][n]);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int testCases = sc.nextInt();
        for (int testCase = 0; testCase < testCases; testCase++) {
            int n = sc.nextInt();
            int[] arr = new int[n+1];
            for (int i = 1; i <= n; i++)
                arr[i] = sc.nextInt();
            solution(arr, n);
        }
    }
}

 

'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글

[백준 2293번] 동전 1  (0) 2020.12.18
[백준 1520번] 내리막 길  (0) 2020.12.18
[백준 11049번] 행렬 곱셈 순서  (0) 2020.12.18
[백준 12865번] 평범한 배낭  (0) 2020.12.14
[백준 1912번] 연속합  (2) 2020.12.13
Comments