* Computer Science/Algorithm

baekjun 행렬의 곱셈순서

soicem 2018. 11. 2. 21:14

 D[i][j] = min(D[i][k] + D[k+1][j] + m[i][0] * m[i][1] * m[j][1])  if i <= k < j


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstring>
using namespace std;
 
int matrix[501][2];
int cache[501][501];
 
// D[i][j] = min(D[i][k] + D[k +1][j] + m[i][0] * m[k][1] * m[j][1]);
 
int multrix(int y, int x){
    if(y == x) return 0;
    if(y + 1 == x) return matrix[y][0* matrix[y][1* matrix[x][1]; // 없어도 되지만 속도문
    if(cache[y][x] != -1return cache[y][x];
    int &ret = cache[y][x];
    ret = -1;
    for(int k = y; k < x; k++){
        int tmp = multrix(y, k) + multrix(k + 1, x);
        tmp += matrix[y][0* matrix[k][1* matrix[x][1];
        if(ret == -1 || ret > tmp){
            ret = tmp;
        }
    }
    return ret;
}
 
int main(){
    int N;
    cin >> N;
    memset(cache, -1sizeof(cache));
    for(int i=1; i <= N; i++){
        cin >> matrix[i][0>> matrix[i][1];
    }
    cout << multrix(1, N);
    return 0;
}
 
cs


'* Computer Science > Algorithm' 카테고리의 다른 글

baekjun 자두나무  (0) 2018.11.08
baekjun 구간나누기  (0) 2018.11.07
baekjun 팰린드롬 분할  (0) 2018.11.02
baekjun coin1, coin2  (0) 2018.11.02
baekjun 10942. 팰린드롬?  (0) 2018.10.31