标签:
蛮力法:搜索所有可能的计算次序,并计算出每种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。设不同计算次序为P(n)。
说明:
将矩阵连乘积AiAi+1…Aj简记为A[i:j],i≤j。
考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵
Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全
加括号方式为(AiAi+1…AK)(Ak+1Ak+2…Aj)
计算量:
A[i:k]的计算量加上A[k+1:j]的计算量,再加上
A[i:k]和A[k+1:j]相乘的计算量。
(1)分析最优解结构:
(2)建立递推关系
1.设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]。
2.递推方程
#include <iostream> #include <cstdlib> #define MAX 100 using namespace std; void MatrixChain(int p[], int m[][5], int s[][5], int n){ for(int i = 0; i <= n; i++) m[i][i] = 0; for(int r = 2; r <= n; r++) for(int i = 1; i <= n-r+1; i++){ int j = i+r-1; 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 u = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if(u < m[i][j]){ m[i][j] = u; s[i][j] = k; } } } } int main(){ int p[5] = {35,15,5,10,20}; int m[5][5]; int s[5][5]; int num = 4; MatrixChain(p,m,s,num); cout<<m[1][4]<<endl; }
标签:
原文地址:http://www.cnblogs.com/chengsong/p/5370299.html