15.2.1
为了计算,实现了书中的代码。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <string> 5 #include <vector> 6 #include <cassert> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 11 #define MAX 110 12 #define INFINITE 1111111 13 int m[MAX][MAX]; 14 int s[MAX][MAX]; 15 16 void matrix_chain_order(int *p, int len_p) 17 { 18 int len = len_p - 1; 19 for (int i = 0; i < len; i++) 20 m[i][i] = 0; 21 22 for (int length = 2; length <= len; length++) { 23 for (int i = 0; i <= len - length; i++) 24 { 25 int j = length + i - 1; 26 m[i][j] = INFINITE; 27 for (int k = i; k <= j - 1; k++) 28 { 29 int tmp = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]; 30 if (tmp < m[i][j]) 31 { 32 m[i][j] = tmp; 33 s[i][j] = k; 34 } 35 } 36 } 37 } 38 } 39 40 void print_result(int i, int j) 41 { 42 if (i == j) { 43 printf(" A%d ", i + 1); 44 return; 45 } 46 else 47 { 48 int k = s[i][j]; 49 printf("("); 50 print_result(i, k); 51 //printf(")("); 52 print_result(k + 1, j); 53 printf(")"); 54 } 55 } 56 57 int main(int argc, const char * argv[]) 58 { 59 //int p[] = {30, 35, 15, 5, 10, 20, 25}; 60 int p[] = {5, 10, 3, 12, 5, 50, 6}; 61 matrix_chain_order(p, sizeof(p) / sizeof(p[0])); 62 printf("%d\n", m[0][sizeof(p) / sizeof(p[0]) - 2]); 63 print_result(0, sizeof(p) / sizeof(p[0]) - 2); 64 return 0; 65 }
15.2.2
写出伪代码很简单,但是实现上因为不清楚如何返回一个二维的数组,所以暂未实现。
15.2.3
15.3中有,所谓替换法似乎就是类似于归纳法的东西?
15.2.4
直接按照TATRIX-CHAIN-ORDER的代码统计第9行的执行次数,然后*2就可以了。
15.2.5
每加一个括号就少一个元素,因此最后剩下一个元素时候,加了n-1个括号。