๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

๋ฐฑ์ค€ 11066๋ฒˆ : ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ | JAVA

by Yunny52 2023. 3. 27.

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ดค์„ ๋•Œ, ์žฅ(chapter)์˜ ํฌ๊ธฐ๋ฅผ ๋”ํ•œ ๊ฐ’์„ ์ €์žฅํ•ด๋‘๋Š” ์ž‘์—…์ด ํ•„์ˆ˜์ ์ด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” dp๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋– ์˜ฌ๋ž๋‹ค. dp๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž˜ ๋– ์˜ค๋ฅด๊ธด ํ–ˆ์ง€๋งŒ,, dp์˜ ํ•ต์‹ฌ์ธ ์ ํ™”์‹์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋‹ค.

 


๐Ÿ“Œ ํ’€์ด

dp[i][j]๋ฅผ i๋ฒˆ์งธ ์žฅ๋ถ€ํ„ฐ j๋ฒˆ์งธ ์žฅ๊นŒ์ง€์˜ ํ•ฉํ•œ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๊ณ  ํ•˜์ž.

 

๊ทธ๋Ÿผ dp[i][i]๋Š” i๋ฒˆ์งธ ์žฅ ๊ทธ ์ž์ฒด๊ฐ€ ๋  ๊ฒƒ์ด๊ณ ,

dp[i][i+1]๋Š” i๋ฒˆ์งธ ์žฅ(filesize[i])๊ณผ i+1๋ฒˆ์งธ ์žฅ(filesize[i+1])์˜ ํ•ฉ์ธ filesize[i]+filesize[i+1] ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

dp[i][i+2]๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

dp[i][i] + dp[i+1][i+2] + (filesize[i] + filesize[i+1], filesize[i+2])์™€ dp[i][i+1] + dp[i+1][i+2] + (filesize[i] + filesize[i+1], filesize[i+2]) ์ค‘ ๋” ์ž‘์€ ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

 

๊ทธ์— ๋”ฐ๋ผ,

dp[i][j]๋Š” dp[i][divide] + dp[divide+1][j] + sum(i๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ๋ถ€๋ถ„ํ•ฉ)์ด ๋  ๊ฒƒ์ด๋‹ค.

์ด๋•Œ divide๋Š” i์—์„œ j๊นŒ์ง€์˜ ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 


๐Ÿ“Œ ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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()); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜
        int total = 0; // ๊ฒฐ๊ณผ๊ฐ’

        for(int t = 0; t < T; t++) {

            // ํŒŒ์ผ ๊ฐœ์ˆ˜
            int K = Integer.parseInt(br.readLine());

            // ํŒŒ์ผ ๋‹ด์„ ๋ฐฐ์—ด ๋ฐ ํŒŒ์ผ ํฌ๊ธฐ์˜ ํ•ฉ์„ ๋‹ด์„ ๋ฐฐ์—ด๊ณผ dp ๋ฐฐ์—ด
            int[] fileSize = new int[K+1];
            int[] sum = new int[K+1];
            int[][] dp = new int[K+1][K+1];

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

            // dp ์—ฐ์‚ฐ ๊ณผ์ •
            for(int n = 1; n <= K; n++) { // ๋ช‡ ๊ฐœ์˜ ์žฅ์„ ๋ฌถ์„ ๊ฒƒ์ธ๊ฐ€
                for(int from = 1; from + n <= K; from++) { // ์–ด๋””๋ถ€ํ„ฐ ๋ฌถ์„ ๊ฒƒ์ธ๊ฐ€
                    int to = from + n;
                    dp[from][to] = Integer.MAX_VALUE;
                    for(int divide = from; divide < to; divide++) {
                        dp[from][to] = Math.min(dp[from][to], dp[from][divide] + dp[divide+1][to] + sum[to] - sum[from-1]);
                    }
                }
            }

            // ์ฒซ๋ฒˆ์งธ ํŒŒ์ผ๋ถ€ํ„ฐ K๋ฒˆ์งธ ํŒŒ์ผ๊นŒ์ง€์˜ ํ•ฉ
            System.out.println(dp[1][K]);

        }

    }

}

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

 

11066๋ฒˆ: ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

์†Œ์„ค๊ฐ€์ธ ๊น€๋Œ€์ „์€ ์†Œ์„ค์„ ์—ฌ๋Ÿฌ ์žฅ(chapter)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์“ฐ๋Š”๋ฐ, ๊ฐ ์žฅ์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณค ํ•œ๋‹ค. ์†Œ์„ค์˜ ๋ชจ๋“  ์žฅ์„ ์“ฐ๊ณ  ๋‚˜์„œ๋Š” ๊ฐ ์žฅ์ด ์“ฐ์—ฌ์ง„ ํŒŒ์ผ์„ ํ•ฉ์ณ์„œ ์ตœ์ข…์ ์œผ๋กœ ์†Œ์„ค์˜ ์™„์„ฑ๋ณธ

www.acmicpc.net

 

 

๋Œ“๊ธ€