https://www.acmicpc.net/problem/11049
풀이
행렬이 여러개 주어지고 어떤 순서로 곱을 했을 때 연산이 최소가 되는지 구하는 문제이다.
AxB인 행렬과 BxC인 행렬을 곱할 때 필요한 연산의 횟수는 AxBxC이다.
행렬 A, B, C가 있을 때 각각 0, 1, 2의 번호라고 하면
dp[1][2]는 BxC의 횟수, dp[0][2]는 AxBxC의 횟수를 저장했다.
메모리: 17736KB
시간: 256ms
언어: 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 N = Integer.parseInt(br.readLine());
int[][] matrix = new int[N][2];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
matrix[i][0] = Integer.parseInt(st.nextToken());
matrix[i][1] = Integer.parseInt(st.nextToken());
}
int[][] dp = new int[N][N];
for (int i = 0; i < N - 1; i++) {
dp[i][i + 1] = matrix[i][0] * matrix[i][1] * matrix[i + 1][1];
}
for (int i = 2; i < N; i++) {
for (int j = 0; j + i < N; j++) {
dp[j][i + j] = Integer.MAX_VALUE;
for (int k = j; k < i + j; k++) {
dp[j][i + j] = Math.min(dp[j][i + j],
dp[j][k] + dp[k + 1][i + j] + matrix[j][0] * matrix[k][1] * matrix[i + j][1]);
}
}
}
System.out.println(dp[0][N - 1]);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 11000: 강의실 배정 - JAVA (0) | 2024.05.14 |
---|---|
[백준] 1202: 보석 도둑 - JAVA (0) | 2024.05.14 |
[백준] 11066: 파일 합치기 - JAVA (0) | 2024.05.14 |
[백준] 2410: 2의 멱수의 합 - JAVA (0) | 2024.05.13 |
[백준] 1655: 가운데를 말해요 - JAVA (0) | 2024.05.13 |
[백준] 15681: 트리와 쿼리 - JAVA (0) | 2024.05.13 |