矩阵连乘问题动态规划算法

#include"stdio.h"

int m[7][7],s[7][7];
int p[7];

	void MatrixChain(int n, int *p, int m[7][7], int s[7][7])
	{
		int i, j, k, r, tmp;
		for(i=1;i<=n;i++) m[i][i]=0;
		for(r=2;r<=n;r++)
		{
			for(i=1;i<=n-r+1;i++)
			{
				j=i+r-1;
				m[i][j]= m[i+1][j]+p[i-1]*p[i]*p[j];   
				s[i][j]=i;
				for(k=i+1;k<j;k++)
				{
					tmp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
					if(tmp<m[i][j])
					{
						m[i][j]=tmp;   
						s[i][j]=k;
					}
				}
			}
		}
	}

	void Traceback(int i, int j, int s[7][7]){
		if(i==j) return;
		Traceback(i, s[i][j], s);
		Traceback(s[i][j]+1, j, s);
		printf("Multiply A%d,%d",i,s[i][j]);
		printf("and A%d,%d\n",s[i][j]+1,j);
	}

int main()
{
	p[0]=30;p[1]=35;p[2]=15;p[3]=5;p[4]=10;p[5]=20;p[6]=25;
	MatrixChain(6, p, m, s);
	Traceback(1,6,s);
	return 0;
}

点赞