矩阵连乘问题

  •  
  • 实验目的

1、理解动态规划算法概念。

2、掌握动态规划算法的基本要素:

(1)最优子结构性质    (2)重叠子问题性质

  • 实验内容

给定n个矩阵{A1, A2, …, An},其中Ai和Ai+1是可乘的, i = 1, 2, …,n-1考察这n个矩阵的连乘积A1A2A3,…,An,使得其乘法次数最少。

实验要求:

要求计算出最优值,并构造出最优解。

实验步骤:

分析最优解的结构

建立递归关系

计算最优值

构造最优解

 

  • 关键代码记录
    #include<iostream>
    using namespace std;
    int m[100][100];
    int s[100][100];
    int p[100];
    
    int MatrixChain(int* p, int n)
    {
    	for (int i = 1; i <= n; i++) { m[i][i] = 0; }//初始化单个矩阵的乘法次数都为0
    	for (int r = 2; r <= n; r++)//r为矩阵连乘的长度,即矩阵个数
    		for (int i = 1; i <= n - r + 1; i++) {//i为矩阵连乘的起点
    			int j = i + r - 1;                               //j为终点
    			m[i][j] = m[i][i] + 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;
    				}
    			}
    		}
    	return m[1][n];
    }
    
    void print_optimal(int i, int j)
    
    {
    	if (i == j) {
    		cout << " A[" << p[i - 1] << "," << p[i] << "]";
    	}
    	else {
    		cout << " ( ";
    		print_optimal(i, s[i][j]);
    		print_optimal(s[i][j] + 1, j);
    		cout << " ) ";
    	}
    }
    int main()
    {
    	int n;
    	cout << "请输入矩阵的个数" << endl;
    	cin >> n;
    	cout << "请输入 " << n + 1 << " 个整数" << endl;
    	for (int i = 0;i <= n;i++)
    	{
    		cin >> p[i];
    	}
    	cout << "原始数据为以下矩阵" << endl;
    	for (int i = 0;i < n;i++)
    	{
    		cout << "\t" << p[i] << " * " << p[i + 1] << endl;
    	}
    	cout << "m矩阵" << endl;
    	for (int i = 1;i <= n;i++)
    	{
    		for (int j = 1;j <= n;j++)
    		{
    			m[i][j] = MatrixChain(p, n + 1);
    		}
    	}
    	for (int i = 1;i <= n;i++) {
    		for (int j = 1;j <= n;j++) {
    			cout << m[i][j] << "\t";
    		}
    		cout << endl;
    	}
    	cout << endl;
    	cout << "s矩阵" << endl;
    	for (int i = 1;i <= n;i++) {
    		for (int j = 1;j <= n;j++) {
    			cout << s[i][j] << "\t";
    		}
    		cout << endl;
    	}
    
    	cout << "最优的运算方式的乘法次数为:" << MatrixChain(p, n) << endl;
    	cout << "加括号的方式为:" << endl;
    	print_optimal(1, n);
    	cout << endl << endl;
    	system("pause");
    }
    

 测试数据:假设矩阵个数为2,五个数字为4 6 8 9 7,得出最优值为732

b8bfaa211aa44650a0ed3ec2e7a73c29.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值