动态规划 的方法求矩阵乘法的最少计算加括号方式

代码:

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


void init(int ***,int ***,int **,int);
void destroy(int ***,int ***,int **,int);
void MatrixChain(int ***,int ***,int *,int);
void TraceBack(int **s,int,int);


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

	cout<<"请输入矩阵的个数:"<<endl;
	cin>>n;


	//初始化
	init(&m,&s,&p,n);

	MatrixChain(&m,&s,p,n);


	printf("\n\nmatrix m's information:\n");
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < n;j++)
			printf("%6d ",m[i][j]);
		printf("\n");
	}
	printf("\n\nmatrix s's information:\n");
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < n;j++)
			printf("%2d ",s[i][j]);
		printf("\n");
	}


	//构造最优解
	TraceBack(s,0,n-1);

	//释放资源
	destroy(&m,&s,&p,n);

	return 0;


}


//分配资源(初始化)
void init(int ***m,int ***s,int **p,int  n)
{

	//数组初始化

	(*p) = new int[n+1];


	(*m) = new int*[n];
	(*s) = new int*[n];

	for(int i = 0;i < n;i++)
		(*m)[i] = new int[n];

	for(int i = 0;i < n;i++)
		(*s)[i] = new int[n];

	//3õꌻˉ
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < n;j++)
		{
			(*m)[i][j] = 0;
			(*s)[i][j] = 0;
		}
	}

	cout<<"请输入维度信息:"<<endl;
	for(int i = 0;i <= n;i++)
	{
		cin>>(*p)[i];
	}


}


//构造最优解
void MatrixChain(int ***m,int ***s,int *p,int n)
{
	//纵横轴的调试
	for(int i = 1;i < n;i++)
	{
		for(int j = 0;j < n-i;j++)
		{
			int k = i+j;
			(*m)[j][k] = (*m)[j+1][k]+p[j]*p[j+1]*p[k+1];
			(*s)[j][k] = j;
			for(int q = j+1;q < k;q++)
			{
				int t = (*m)[j][q]+(*m)[q+1][k] + p[j]*p[q+1]*p[k+1];
				if(t < (*m)[j][k])
				{
					(*m)[j][k] = t;
					(*s)[j][k] = q;
				}
			}
		}
	}
}

//释放资源 
void destroy(int ***m,int ***s,int **p,int  n)
{
	delete [] (*p);
	(*p) = NULL;

	for(int i = 0;i < n;i++)
	{
		delete [] (*s)[i];
		delete [] (*m)[i];
		(*s)[i] = NULL;
		(*m)[i] = NULL;
	}

	delete [] (*s);
	delete [] (*m);
	(*s) = NULL;
	(*m) = NULL;
}



//构造最优解

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



运行结果:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值