动态规划解决矩阵连乘

#include<iostream>
using namespace std;
#include<stdio.h>


/*p是一维数组,记录矩阵的规模(第一个矩阵的行和其余矩阵的列);
n是矩阵的个;m是二维数组,记录计算A[i:j],1<=i<=j<=n所需要的最少数乘次数m[i][j];
相对应于m[i][j]的断开位置k记为s[i][j]*/

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

void Traceback(int i,int j,int **s){
	if(i == j)
	{
		cout<<"A"<<i;
		return;
	}
	cout<<"(";
	Traceback(i,s[i][j],s);
	Traceback(s[i][j]+1,j,s);
	cout<<")";


}

void main(){
	int **s;
	int **m;
	int n;
	int *p;

	cout<<"输入矩阵个数:";
	cin>>n;
	p = (int*)malloc((n+1) * sizeof(int));

	s = (int**)malloc((n+1) * sizeof(int*));
	for(int i = 1;i <= n;i++)
		s[i] = (int*)malloc((n+1) * sizeof(int));

	m = (int**)malloc((n+1) * sizeof(int*));
	for(i = 1;i <= n;i++)
		m[i] = (int*)malloc((n+1) * sizeof(int));

	cout<<"输入矩阵规模:(第一个的行数和其余矩阵的列数)";
	for( i = 0;i <= n;i++)
		cin>>p[i];

   MatrixChain(p,n,m,s);
   Traceback(1,n,s);
   cout<<m[1][n];



}


你可能感兴趣的:(动态规划解决矩阵连乘)