动态规划之矩阵连乘
什么是动态规划
动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
1 /* Matrix.h */ 2 3 #pragma once 4 #ifndef MATRIX_H 5 #define MATRIX_H 6 7 class Matrix 8 { 9 public: 10 Matrix(); //构造函数 11 ~Matrix(); //析构函数 12 bool Run(); //运行接口函数 13 private: 14 int W; //记录矩阵的个数 15 int **m; //存放最优值,即最小运算量 16 int **s; //断开位置 17 int *p; //存放 18 19 bool Input(); //处理输入 20 bool MatrixChain();//计算最优值算法 21 void Traceback(int i, int j, int **s); //输出矩阵加括号的方式 22 }; 23 24 #endif
1 /* Matrix.c */ 2 3 #define N 50 4 #include <iostream> 5 #include <stdlib.h> 6 #include "Matrix.h" 7 8 //构造函数,作变量初始化工作,为指针分配内存空间 9 Matrix::Matrix() 10 { 11 W = 0; 12 m = new int*[N]; 13 s = new int*[N]; 14 for (int i = 0; i<N; i++) 15 { 16 m[i] = new int[N]; 17 s[i] = new int[N]; 18 } 19 p = new int[N]; 20 } 21 22 //析构函数,释放内存 23 Matrix::~Matrix() 24 { 25 for (int i = 0; i<N; i++) 26 { 27 delete[]m[i]; 28 delete[]s[i]; 29 } 30 delete[]m; 31 delete[]s; 32 delete[]p; 33 } 34 35 //处理键盘输入 36 bool Matrix::Input() 37 { 38 using namespace std; 39 int w; 40 cout << "矩阵个数:"; 41 cin >> w; 42 W = w; 43 cout << "输入矩阵A1维数" << ":"; 44 cin >> p[0] >> p[1]; 45 for (int i = 2; i <= W; i++) 46 { 47 int m = p[i - 1]; 48 cout << "输入矩阵A" << i << "维数:"; 49 cin >> p[i - 1] >> p[i]; 50 if (p[i - 1] != m) 51 { 52 cout << endl << "维数不对,矩阵不可乘!" << endl; 53 exit(1); 54 } 55 //cout<<endl; 56 } 57 if (p != NULL) 58 return true; 59 else 60 return false; 61 } 62 63 //计算最优值算法 64 bool Matrix::MatrixChain() 65 { 66 if (NULL == p) 67 return false; 68 for (int i = 1; i <= W; i++) 69 m[i][i] = 0; 70 for (int r = 2; r <= W; r++) 71 for (int i = 1; i <= W - r + 1; i++) 72 { 73 int j = i + r - 1; 74 m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j]; 75 s[i][j] = i; 76 for (int k = i + 1; k<j; k++) 77 { 78 int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; 79 if (t<m[i][j]) 80 { 81 m[i][j] = t; 82 s[i][j] = k; 83 } 84 } 85 } 86 return true; 87 } 88 89 //输出矩阵结合方式,加括号 90 void Matrix::Traceback(int i, int j, int **s) 91 { 92 using namespace std; 93 if (i == j) 94 { 95 cout << "A" << i; 96 } 97 else if (i + 1 == j) 98 { 99 cout << "(A" << i << "A" << j << ")"; 100 } 101 else 102 { 103 cout << "("; 104 Traceback(i, s[i][j], s); 105 Traceback(s[i][j] + 1, j, s); 106 cout << ")"; 107 } 108 } 109 110 bool Matrix::Run() 111 { 112 using namespace std; 113 if (Matrix::Input()) 114 { 115 if (Matrix::MatrixChain()) 116 { 117 Matrix::Traceback(1, W, s); 118 cout << endl; 119 return true; 120 } 121 else 122 return false; 123 } 124 else 125 return false; 126 }
1 /* Main.c */ 2 3 #include "Matrix.h" 4 5 int main() 6 { 7 Matrix matrix; 8 matrix.Run(); 9 return 0; 10 }
本文来自博客园,作者:Arthurian,转载请注明原文链接:https://www.cnblogs.com/Arthurian/p/8977455.html
欢迎邮件交流:zhuanxinxin@aliyun.com