动态规划矩阵连乘c++

**//参考:
// https://www.cnblogs.com/henuliulei/p/10074465.html
//https://www.jianshu.com/p/59f6fac01315

//维数分别为10100 , 1005 , 550
// 按此顺序计算需要的次数
// ((A1
A2)A3):10X100X5+10X5X50=7500次,
//按此顺序计算需要的次数
// (A1
(A2A3)):10550+1010050=75000次
//ai
(bibjcj)[ci==bj] (aibibj)(ci*cj)
//
//计算矩阵链A[i:j]的最佳方式应在矩阵Ak和Ak+1之间断开,
即最优的加括号方式应为(A[i:k])(A[k+1:j)
//核心思想:
//对于子问题存在相互交叉的问题,中间结果可能被计算多次,
// //对于矩阵:记录不同子段长的矩阵乘结果!!!!!!!!!!!
//最简单的办法是:用一个全局数组记录,之后再查表即可。
//而真正的动态规划不止这个特点,还有一个特点,自底向上的计算方法,递归是自顶向下。
//从短的子段开始相乘!!!!!!n(矩阵总个数)>=r>=2
//
//
**

#include<bits/stdc++.h>
using namespace std;

void JuZhen(int n,int arr[],int x[][100],int m[][100]);
void JuZhen(int n,int arr[],int x[][100],int m[][100])
{
	for (int t = 1; t <=n; t++)
	{
		m[t][t] = 0;
	}
	for(int r=2;r<=n;r++)//分为r>=2长度的子部分矩阵段相乘,r=1,结果为零即对角线
		for (int i = 1; i <= n-r+1; i++)//起始位置第i行,截至位置判断
		{
			int j = i + r-1;//[i,j]的个数是r,j<=n,i<=n+1-r!!!!!
			m[i][j] = m[i + 1][j] + arr[i - 1] * arr[i] * arr[j];//因为m[i][i]=0
			x[i][j]=i;//!!!!
			for (int k = i + 1; k<j; k++)
			{
				int t = m[i][k] + m[k + 1][n] + arr[i - 1] * arr[k] * arr[j];
				if (m[i][j] > t)
				{
					m[i][j] = t;
					x[i][j] = k;//记录k的值
				}
			}
		}
}
void Traceback(int i,int j,int x[][100])
{
	if (i == j)
		cout << "A" << i;
	else
	{
		cout << "(";
		Traceback(i, x[i][j],x);
		Traceback(x[i][j] + 1, j,x);
		cout << ")";
	}
}
int main()
{
	int m[100][100] = {0};
	memset(m,0,sizeof(m));
	int n=6;//矩阵个数
	//cin >> n;

//	memset(arr,0,sizeof(arr));
	int	arr[]={30,35,15,5,10,20,25};
	int x[100][100];
	memset(x,0,sizeof(x));
	JuZhen(n,arr,x,m);

	cout<<"最后结果为:"<<m[1][n]; 
	Traceback(1,n,x);
	//destroyAllWindows();
}

Dev c++实现
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值