矩阵链乘的优化
问题产生的原因:![](https://images0.cnblogs.com/blog/751746/201507/171944265638696.jpg)
如图,对于矩阵的链乘时,我们可以采用不同的组合进行相乘
![](https://images0.cnblogs.com/blog/751746/201507/171944270794840.jpg)
当然不同的组合会产生不同的效率。不同的组合所产生的效率如下:
![](https://images0.cnblogs.com/blog/751746/201507/171944273766283.jpg)
上面表达式的意思是,对于一个从Ai乘到Aj的矩阵链乘运算,我们可以将问题进行划分为两个子问题如下:
从Ai 乘到Ak的效率代价加上Ak+1到Aj的代价,再加上(呵呵,最要的问题)它们两者的结果相乘的代价。
代码如下:
#include"MultiPlay.h"
int storePath[20][20]={0};
int main(){
int multiDem[7]={30,35,15,5,10,20,25};
std::cout<<multiplay_iterator(multiDem,2,5)<<std::endl;
printMultiPath(3,5);
}
#ifndef MULTIPLAY_H_
#define MULTIPLAY_H_
#include<iostream>
#include<string>
unsigned int multiplay_iterator(int *multiDem,int start,int end);
void printMultiPath(int start,int end);
#endif
#include"MultiPlay.h"
int valueStore[20][20]={0};
extern int storePath[20][20];
unsigned int multiplay_iterator(int *multiDem,int start,int end){
if(start==end)
return 0;
if(valueStore[start][end]!=0)
return valueStore[start][end];
int multiCount=655360;
for(int i=start;i<end; i++){
if(multiCount>(multiplay_iterator(multiDem,start,i)+multiplay_iterator(multiDem,i+1,end)+multiDem[start-1]*multiDem[i]*multiDem[end])){
storePath[start][end]=i;
multiCount=multiplay_iterator(multiDem,start,i)+multiplay_iterator(multiDem,i+1,end)+multiDem[start-1]*multiDem[i]*multiDem[end];
}
}
valueStore[start][end]=multiCount;
return multiCount;
}
void printMultiPath(int start,int end){
if(start==end)
return ;
if(storePath[start][end]==start||storePath[start][end]==end)
return;
std::cout<<"A"<<start<<" * "<<"A"<<storePath[start][end]<<std::endl;
std::cout<<"A"<<storePath[start][end]+1<<" * "<<"A"<<end<<std::endl;
printMultiPath(start,storePath[start][end]);
printMultiPath(storePath[start][end]+1,end);
}
![](https://images0.cnblogs.com/blog/751746/201507/171944290015753.jpg)
以上这个公式便使这个优化问题将原问题和子问是以及己知条件很好地联系在一起,建立起它们之间的桥梁