1. 程式人生 > 其它 >動態規劃之矩陣連乘

動態規劃之矩陣連乘

 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 }

作者:耑新新,釋出於部落格園

轉載請註明出處,歡迎郵件交流:[email protected]