15.2 动态规划

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个括号。

转载于:https://www.cnblogs.com/leiatpku/p/3352253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值