행렬 곱셈

시간 제한2초메모리 제한512 MB

요약
n개의 행렬 각 접두사에 대해 어떤 순서로든 곱셈이 가능한지 판별하고, 가능하면 최종 결과 행렬 넓이의 최댓값을 구한다.
난이도

어려움10점 중 8점

유형
그리디, 정렬, 구현, 수학
정답자
아직 제출이 없습니다

문제

nn개의 행렬 M1,M2,…,MnM_1, M_2, \dots, M_n이 주어진다. 행렬 MiM_i (i=1,2,…,ni = 1, 2, \dots, n)는 R[i]R[i]개의 행과 C[i]C[i]개의 열을 가진다 (R[i]×C[i]R[i] \times C[i]).

정수 ii (1≤i≤n1 \le i \le n)에 대해 다음 값 ViV_i를 계산하려고 한다.

먼저, ii개의 행렬 M1,M2,…,MiM_1, M_2, \dots, M_i를 모두 곱할 수 있는 순서가 있는지 알아본다. 행렬 곱셈에서 R×CR \times C 행렬과 R′×C′R' \times C' 행렬을 곱하려면 C=R′C = R'이어야 하고, 결과는 R×C′R \times C' 행렬이다. ii개의 행렬을 순서를 자유롭게 재배치하더라도 곱하는 것이 불가능하면 Vi=0V_i = 0으로 정의한다. 가능하면, 가능한 모든 방법 중 최종 결과 행렬의 크기가 가장 커지는 방법을 찾아, 그때 결과로 나온 행렬의 크기 (행의 수 ×\times 열의 수)가 ViV_i 값이 된다.

V1,V2,…,VnV_1, V_2, \dots, V_n을 구해보자.

입력

첫째 줄에는 자연수 nn이 주어진다 (1≤n≤1,0001 \le n \le 1{,}000). 다음 nn줄에는 각 줄에 정수 두 개가 주어지는데, 각 행렬의 행의 수 R[i]R[i]와 열의 수 C[i]C[i]이다. 각 행렬의 행의 수와 열의 수는 1 이상 1,000 이하이다.

출력

총 nn줄을 출력해야 하고, 각 줄에는 V1V_1부터 VnV_n까지 ViV_i 값을 출력한다.

예제5

  1. 예제 1

    입력
    3
    8 2
    2 8
    2 2
    
    예상 출력
    16
    64
    64
    
  2. 예제 2

    입력
    3
    4 9
    9 1
    9 9
    
    예상 출력
    36
    4
    4
    
  3. 예제 3

    입력
    3
    4 10
    10 1
    10 6
    
    예상 출력
    40
    4
    0
    
  4. 예제 4

    입력
    3
    10 3
    3 10
    5 5
    
    예상 출력
    30
    100
    0
    
  5. 예제 5

    입력
    4
    1 1
    1 1
    1 1
    1 1
    
    예상 출력
    1
    1
    1
    1