[算法导论读书笔记]矩阵链乘法

参考资料:http://net.pku.edu.cn/~course/cs101/2007/resource/Intro2Algorithm/book6/chap16.htm

代码示例:

#include <stdio.h>
#include <string.h>
//共有6个矩阵相乘
#define N 6
//代表无穷大
#define infinity 4280000
void PrintOptimalParens( unsigned long s[][N + 1], int i, int j)
{
	if( i == j)
		printf("A%d", i);
	else
	{
		printf("(");
		PrintOptimalParens( s, i, s[i][j]);
		PrintOptimalParens( s, s[i][j] + 1, j);
		printf(")");
	}
}
void MatrixChainOrder( int *p )
{
	unsigned long  m[N+1][N+1], s[N+1][N+1];
	int i, j, q, l;
	int k;
	memset( m, 0, sizeof( m[0][0]) * (N + 1)*(N + 1) );
	memset( s, 0, sizeof( m[0][0]) * (N + 1)*(N + 1) );
	
	for( l = 2; l <= N; l++)// l is the chain length
	{
		for( i = 1; i <= N - l + 1; i++)
		{
			j = i + l -1;
			m[i][j] = infinity;
			for( k = i; k <= j - 1; k++ )
			{
				q = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];
				if( q < m[i][j] )
				{
					m[i][j] = q;
					s[i][j] = k;
				}
			}
		}
	}
PrintOptimalParens( s, 1, 6 );
printf("\n总的代价:%lu\n", m[1][N]);

	for( i = 1; i <= N; i++)
	{
		for( j = 1; j <= N; j++)
			printf("%8lu  ", m[i][j]);
		puts("");
	}
			
}
int main(int argc, char* argv[])
{
	int p[] = {30, 35, 15, 5, 10, 20, 26};
	MatrixChainOrder( p );
	return 0;
}


你可能感兴趣的:(算法,读书)