알고리즘
백준 11066 파일합치기 (java)
창따오
2023. 12. 5. 22:17
728x90
출처: https://www.acmicpc.net/problem/11066
소스코드
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Baek11066 {
static int tc;
static StringBuilder sb = new StringBuilder();
static int k; //파일의 크기
public static void main(String[] args) throws IOException {
//풀어야 할 문제...
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
tc = Integer.parseInt(br.readLine());
for (int t = 0; t < tc; t++) {
k = Integer.parseInt(br.readLine());
int[][] dp = new int[k + 1][k + 1]; //dp에 담길 값은 특정 chapter 부터 또다른 특정 chapter까지
int[] sum = new int[k + 1];
int[] chapters = new int[k + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int n = 1; n <= k; n++) {
chapters[n] = Integer.parseInt(st.nextToken());
sum[n] = sum[n - 1] + chapters[n];
}
for (int i = 1; i < k; i++) {
for (int from = 1; from + i <= k; from++) {
int to = from + i;
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]);
}
}
}
sb.append(dp[1][k]).append("\n");
}
System.out.println(sb.toString());
}
}