TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|


- #include <iostream>
- #include <vector>
- #define MAXVALUE 100000;
- using namespace std;
- void matrix_chain_order(vector<int>p,vector<vector<int>>&m,vector<vector<int>>&s)
- {
- int i, j, k, t;
- int N = p.size() - 1;
- for (i = 0; i <= N; ++i)
- m[i][i] = 0;
- for (t = 2; t <= N; t++) //当前链乘矩阵的长度
- {
- for (i = 1; i <= N - t + 1; i++) //从第一矩阵开始算起,计算长度为t的最少代价
- {
- j = i + t - 1;//长度为t时候的最后一个元素
- m[i][j] = MAXVALUE; //初始化为最大代价
- for (k = i; k <= j - 1; k++) //寻找最优的k值,使得分成两部分k在i与j-1之间
- {
- int temp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
- if (temp < m[i][j])
- {
- m[i][j] = temp; //记录下当前的最小代价
- s[i][j] = k; //记录当前的括号位置,即矩阵的编号
- }
- }
- }
- }
- }
- //s中存放着括号当前的位置
- void print_optimal_parents(vector<vector<int>>&s, int i, int j)
- {
- if (i == j)
- cout << "A" << i;
- else
- {
- cout << "(";
- print_optimal_parents(s, i, s[i][j]);
- print_optimal_parents(s, s[i][j] + 1, j);
- cout << ")";
- }
- }
- int main()
- {
- int P[7] = { 30, 35, 15, 5, 10, 20, 25 };
- vector<int>p(P, P + 7);
-
- vector<int>tmp(p.size(), 0);
- vector<vector<int>>m(p.size(), tmp);
- vector<vector<int>>s(p.size(), tmp);
- int i, j;
- matrix_chain_order(p, m, s);
- cout << "m value is: " << endl;
- for (i = 1; i <= 6; ++i)
- {
- for (j = 1; j <= 6; ++j)
- cout << m[i][j] << " ";
- cout << endl;
- }
- cout << "s value is: " << endl;
- for (i = 1; i <= 6; ++i)
- {
- for (j = 1; j <= 6; ++j)
- cout << s[i][j] << " ";
- cout << endl;
- }
- cout << "The result is:" << endl;
- print_optimal_parents(s, 1, 6);
- return 0;
- }
复制代码
|
|