- 实验目的
1、理解动态规划算法概念。
2、掌握动态规划算法的基本要素:
(1)最优子结构性质 (2)重叠子问题性质
- 实验内容
给定n个矩阵{A1, A2, …, An},其中Ai和Ai+1是可乘的, i = 1, 2, …,n-1考察这n个矩阵的连乘积A1A2A3,…,An,使得其乘法次数最少。
实验要求:
要求计算出最优值,并构造出最优解。
实验步骤:
分析最优解的结构
建立递归关系
计算最优值
构造最优解
- 关键代码记录
#include<iostream> using namespace std; int m[100][100]; int s[100][100]; int p[100]; int MatrixChain(int* p, int n) { for (int i = 1; i <= n; i++) { m[i][i] = 0; }//初始化单个矩阵的乘法次数都为0 for (int r = 2; r <= n; r++)//r为矩阵连乘的长度,即矩阵个数 for (int i = 1; i <= n - r + 1; i++) {//i为矩阵连乘的起点 int j = i + r - 1; //j为终点 m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j]; s[i][j] = i; for (int k = i + 1; k < j; k++) {//找出更优的乘法次数 int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; if (t < m[i][j]) { m[i][j] = t; s[i][j] = k; } } } return m[1][n]; } void print_optimal(int i, int j) { if (i == j) { cout << " A[" << p[i - 1] << "," << p[i] << "]"; } else { cout << " ( "; print_optimal(i, s[i][j]); print_optimal(s[i][j] + 1, j); cout << " ) "; } } int main() { int n; cout << "请输入矩阵的个数" << endl; cin >> n; cout << "请输入 " << n + 1 << " 个整数" << endl; for (int i = 0;i <= n;i++) { cin >> p[i]; } cout << "原始数据为以下矩阵" << endl; for (int i = 0;i < n;i++) { cout << "\t" << p[i] << " * " << p[i + 1] << endl; } cout << "m矩阵" << endl; for (int i = 1;i <= n;i++) { for (int j = 1;j <= n;j++) { m[i][j] = MatrixChain(p, n + 1); } } for (int i = 1;i <= n;i++) { for (int j = 1;j <= n;j++) { cout << m[i][j] << "\t"; } cout << endl; } cout << endl; cout << "s矩阵" << endl; for (int i = 1;i <= n;i++) { for (int j = 1;j <= n;j++) { cout << s[i][j] << "\t"; } cout << endl; } cout << "最优的运算方式的乘法次数为:" << MatrixChain(p, n) << endl; cout << "加括号的方式为:" << endl; print_optimal(1, n); cout << endl << endl; system("pause"); }
测试数据:假设矩阵个数为2,五个数字为4 6 8 9 7,得出最优值为732