矩陣連乘(動態規劃演算法)
問題提出:
定n個矩陣:A1,A2,…,An,其中Ai與Ai+1是可乘的(i=1,2…,n-1)。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸出結果為計算矩陣連乘積的計算次序和最少數乘次數。
問題分析:
由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。
例如,計算三個矩陣連乘{A1,A2,A3};維數分別為10×100 , 100×5 , 5×50 按此順序計算需要的次數((A1A2)A3):10X100X5+10X5X50=7500次,按此順序計算需要的次數(A1(A2A3)):10550+1010050=52500次。
所以問題是:如何確定運算順序,可以使計算量達到最小化。
演算法思路:
- m[i][j] 表示A[i:j]的計算量 ;
- A[i:k]的計算量為m[i][k];
- A[k+1 : j]的計算量為m[k+1][j]
因此,m[i][j] = m[i][k] + m[k+1][j] + p[i-1] * p[i] * p[j];
(p[i-1] * p[i] * p[j]:最後兩個矩陣的計算量)
動態規劃演算法程式碼:
#include<iostream>
#include<vector>
using namespace std;
const int L = 7;
int matrixMultiple(int n, vector< vector<int> > &m, vector< vector<int> > &s, int p[]){
for(int i = 1; i < n; i++){
//對角線設為0,沒有自己和自己乘
m[i][i] = 0;
}
for(int r = 2; r <= n; r++){ //r為規模
for(int i = 1; i <= n-r+1; i++){ //i:首矩陣編號
int j = i + r - 1; //尾矩陣編號
m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j]; //將鏈ij劃分為A(i) *(A[i+1 : j])
s[i][j] = i;
for(int k = i + 1; k < j; k++){ //k:斷開的位置
//將鏈ij劃分為(A[i:k] + A[k+1 : j])
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;
}
}
}
}
return m[1][L-1];
}
void traceBack(int i, int j, vector< vector<int> > &s){
if(i == j)
return ;
traceBack(i, s[i][j], s);
traceBack(s[i][j] + 1, j, s);
cout << "Multiple A[" << i << ", " << s[i][j] << "]";
cout << " and A[" << (s[i][j] + 1) << ", " << j << "]" << endl;
}
int main(){
//A1:30*35 A2:35*15 A3:15*5 A4:5*10 A5:10*20 A6:20*25
//p[0-6]={30,35,15,5,10,20,25}
int p[L]={30, 35, 15, 5, 10, 20, 25};
vector< vector<int> > m(L, vector<int>(L));
vector< vector<int> > s(L, vector<int>(L));
cout<<"矩陣的最少計算次數為:"<<matrixMultiple(6,m,s,p)<<endl;
cout<<"矩陣最優計算次序為:"<<endl;
traceBack(1,6,s); //輸出A[1:6]的最優計算此序
return 0;
}
相關文章
- 矩陣連乘問題 Python 動態規劃矩陣Python動態規劃
- 動態規劃_備忘錄法_矩陣鏈乘問題動態規劃矩陣
- 演算法-動態規劃演算法動態規劃
- 演算法_動態規劃演算法動態規劃
- 動態規劃演算法動態規劃演算法
- 演算法基礎:動態規劃陣列中滾動陣列的使用演算法動態規劃陣列
- NYOJ 1409 快速計算【矩陣連乘】矩陣
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 前端演算法 - 動態規劃前端演算法動態規劃
- 初級演算法-動態規劃演算法動態規劃
- 【每日演算法】動態規劃四演算法動態規劃
- 演算法(七):圖解動態規劃演算法圖解動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 大規模 Transformer 模型 8 位元矩陣乘簡介ORM模型矩陣
- DP 動態規劃入門 一維陣列動態規劃陣列
- 動態規劃動態規劃
- 演算法---貪心演算法和動態規劃演算法動態規劃
- 演算法筆記之動態規劃(4)演算法筆記動態規劃
- Leetcode 題解演算法之動態規劃LeetCode演算法動態規劃
- 動態規劃之 KMP 演算法詳解動態規劃KMP演算法
- 動態規劃演算法原理與實踐動態規劃演算法
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- 動態dp & 矩陣加速遞推矩陣
- 線性規劃之單純形演算法矩陣描述與python實現演算法矩陣Python
- [leetcode] 動態規劃(Ⅰ)LeetCode動態規劃
- 動態規劃法動態規劃
- 模板 - 動態規劃動態規劃
- 動態規劃初步動態規劃
- 動態規劃分析動態規劃
- 動態規劃(DP)動態規劃
- [leetcode初級演算法]動態規劃總結LeetCode演算法動態規劃
- 演算法基礎--遞迴和動態規劃演算法遞迴動態規劃
- 乾貨:圖解演算法——動態規劃系列圖解演算法動態規劃
- 動態規劃演算法——裝最多水的容器動態規劃演算法
- 最小總和問題(動態規劃演算法)動態規劃演算法
- 大廠常考動態規劃演算法題動態規劃演算法
- 聊聊不太符合常規思維的動態規劃演算法動態規劃演算法
- 動態規劃小結動態規劃