동적 계획법 예제 - 11
Last updated
Last updated
dp[i][j] # i ~ j번째 행렬까지 최소 연산 횟수를 저장하는 테이블(-1로 초기화)
N(행렬 개수)
M(행렬 리스트)
for n 반복:
M에 행렬 정보 저장
# s = 시작 행렬 index, e = 종료 행렬 index
solution(s, e):
result
if 이미 계산한 구간:
계산된 값 바로 리턴
if 1개 행렬:
연산 횟수 0 리턴
if 2개 행렬:
2개 행렬 연산값 리턴
if 행렬이 3개 이상:
for i s ~ e: # 재귀 형태
정답 = min(현재 정답값,
solution(s, i) + solution(i + e) + 앞뒤 구간 행렬을 합치기 위한 연산 횟수)
solution(1, N)
정답 출력import sys
input = sys.stdin.readline
N = int(input())
M = []
dp = [[-1 for _ in range(N + 1)] for _ in range(N + 1)]
M.append((0, 0)) # 1번부터 index를 맞추기 위해
for _ in range(N):
x, y = map(int, input().split())
M.append((x, y))
def solution(s, e):
result = sys.maxsize
if dp[s][e] != -1: # 메모이제이션
return dp[s][e]
if s == e: # 행렬이 1개
return 0
if s + 1 == e: # 행렬이 2개
return M[s][0] * M[s][1] * M[e][1]
# 행렬이 3개 이상
for i in range(s, e):
alpha = M[s][0] * M[i][1] * M[e][1]
result = min(result, alpha + solution(s, i) + solution(i + 1, e))
dp[s][e] = result
return dp[s][e]
print(solution(1, N))import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static class Matrix {
int row, col;
public Matrix(int row, int col) {
this.row = row;
this.col = col;
}
}
static Matrix[] M;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new int[N + 1][N + 1];
M = new Matrix[N + 1];
for (int[] ints : dp) {
Arrays.fill(ints, -1);
}
for (int i = 1; i <= N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken());
int col = Integer.parseInt(st.nextToken());
M[i] = new Matrix(row, col);
}
System.out.println(solution(1, N));
}
private static int solution(int s, int e) {
int result = Integer.MAX_VALUE;
if (dp[s][e] != -1) {
return dp[s][e];
}
if (s == e) {
return 0;
}
if (e - s == 1) {
return M[s].row * M[s].col * M[e].col;
}
for (int i = s; i < e; i++) {
int alpha = M[s].row * M[i].col * M[e].col;
result = Math.min(result, alpha + solution(s, i) + solution(i + 1, e));
}
return dp[s][e] = result;
}
}