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] != -1) return 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, -1, sizeof(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 |