행렬 곱셈의 최우선 순서

1662 단어
하나의 행렬에 대해 곱셈을 하는 순서가 다르고 전체 원소의 곱셈 횟수도 다르다.우리는 일련의 행렬을 제시한 후에 원소 곱셈 횟수가 가장 적은 계산 순서를 찾을 수 있기를 바란다.
동태적인 기획으로 이 문제를 풀다.
/*
 * =====================================================================================
 *
 *       Filename:  MatrixMul.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2011 12 01  10 43 13 
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  MaZheng (blog.csdn.net/mazheng1989), [email protected]
 *        Company:  Dalian University Of Technology
 *
 * =====================================================================================
 */

#include<stdio.h>

const int n=4;
int Matrix[n][2]={20,2,2,15,15,40,40,4};
int cost[n][n];
int root[n][n];

int Proc(int i,int r,int j)
{
	return Matrix[i][0]*Matrix[r][1]*Matrix[j][1];
}
int pri(int i,int r,int j)
{
	if(i==r&&r==j)
		return -1;
	pri(i,root[i][r],r);
	pri(r+1,root[r+1][j],j);
	printf(" %d ",root[i][j]+1);

}
int main()
{
	for(int i=n-1;i>=0;i--)
	{
		for(int j=i;j<=n-1;j++)
		{
			if(j==i)
			{
				cost[i][j]=0;
				root[i][j]=i;
			        continue;
			}
			for(int r=i;r<=j-1;r++)
			{
				int temp=cost[i][r]+cost[r+1][j]+Proc(i,r,j);
				if(cost[i][j]==0)
				{
					cost[i][j]=temp;
					root[i][j]=r;
				}
				else if(cost[i][j]!=0&&cost[i][j]>=temp)
				{
					cost[i][j]=temp;
					root[i][j]=r;
				}
			}
		//	printf("%d %d %d %d 
",i+1,j+1,cost[i][j],root[i][j]+1); } } printf("least multiply times = %d
",cost[0][n-1]); printf("compute sequece is:
"); pri(0,root[0][n-1],n-1); }

좋은 웹페이지 즐겨찾기