码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵连乘问题

时间:2016-04-09 00:12:30      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

§矩阵连乘问题
§

蛮力法:搜索所有可能的计算次序,并计算出每种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。设不同计算次序为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)分析最优解结构:

Ø计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的。
Ø矩阵连乘计算次序问题的最优解包含着其子问题的最优解,满足最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

(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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!