베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

11066번: 파일 합치기

2022. 8. 20. 18:39

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

 

11066번: 파일 합치기

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class java_11066 {
    static int N;
    static int pages[];
    // 누적합
    static int sum[];

    static int cache[][];

    // cost[start] ~ cost[end] 까지 합치겠다.
    // 이 때 최소비용
    static int dp(int start, int end) {
        if (cache[start][end] != -1) {
            return cache[start][end];
        }

        if (start == end) {
            return 0;
        }

        cache[start][end] = Integer.MAX_VALUE;

        // [0][3] 을 위해서
        // [0][0] [1][3] -> [1][3] -> [1][1] [2][3]/ [1][2] [3][3]

        // [0][1] [2][3] -> [0][0] [1][1] / [2][2] [3][3] => 300
        // [0][2] [3][3]
        for (int i = start; i < end; i++) {
            int left = dp(start, i);
            int right = dp(i + 1, end);
            cache[start][end] = Math.min(cache[start][end], left + right);
        }

        return cache[start][end] += sum[end] - sum[start - 1];
    }

    static int solve() {
        cache = new int[N + 1][N + 1];

        for (int i = 1; i < N + 1; i++) {
            Arrays.fill(cache[i], -1);
        }

        int result = dp(1, N);
        // 1-2 2-3 3-4 4-5 5-6 6-7 7-8...
        // 1-2 3-4

        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());
        for (int i = 0; i < T; i++) {
            N = Integer.parseInt(br.readLine());
            pages = new int[N + 1];
            sum = new int[N + 1];

            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 1; j < pages.length; j++) {
                pages[j] = Integer.parseInt(st.nextToken());

                sum[j] += sum[j - 1] + pages[j];

            }

            bw.write(solve() + "\n");
        }

        br.close();
        bw.close();
    }
}

'Coding Test > BOJ' 카테고리의 다른 글

[java] 2225번: 합분해  (0) 2022.08.20
15817번: 배수 공사  (0) 2022.08.20
23561번: Young한 에너지는 부족하다  (0) 2022.08.20
1789번: 수들의 합  (0) 2022.08.20
25215번: 타이핑  (0) 2022.08.20
    'Coding Test/BOJ' 카테고리의 다른 글
    • [java] 2225번: 합분해
    • 15817번: 배수 공사
    • 23561번: Young한 에너지는 부족하다
    • 1789번: 수들의 합
    베오
    베오

    티스토리툴바